2017-05-15 55 views
-1

当使用Selenium和Java时,我经常遇到关于陈旧的元素引用的错误。我正在测试的应用程序使用AngularJS 2.0。有时候明确的等待会解决问题,但大多数情况下不会。我可以在我的测试中忽略这些错误吗?我如何实现这个?使用Selenium和Java忽略陈旧的元素引用

+1

请阅读[问]和[预计会有多少研究工作?](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow -users)请提供您已经尝试过的代码和执行结果,包括任何错误消息等。还提供一个指向页面和/或相关HTML的链接。 – JeffC

+0

感谢您的评论,但不幸的是我的问题没有解决一段代码。正如你将通过研究这个话题所发现的那样,它很模糊,记录不完整。从我在AngularJS页面上使用Java的陈旧元素的研究来看,你会得到很多答案,但不幸的是,其中大多数都很糟糕。我的问题再次与一段代码无关,而是一段话题。 –

+0

当然是代码。您正在尝试编写代码来自动化您的应用程序,并避免过时的元素异常等。您提到显式等待,但是您没有提供您尝试过的代码,也没有提供我的评论所针对的特定结果(包括错误消息)。 – JeffC

回答

0

阿夫拉姆,

由于应用程序采用了棱角分明的JS,所以这是我们将获得陈旧元素引用异常在某些情况下,理性的应用程序将加载每次。即使我在使用Angular JS的应用程序自动化时遇到同样的问题。量角器工具是此类应用的最佳工具,因为量角器内置等待,因此我们不需要故意等待。解决这个问题的唯一方法是,地点线程每次都会发现异常。在流利的等待代码中保持忽略Stale元素引用类。

new FluentWait<WebDriver>(driver) 
        .withTimeout(Time, TimeUnit.SECONDS) 
        .pollingEvery(
          Time, 
          TimeUnit.SECONDS) 
        .ignoring(NoSuchElementException.class) 
        .ignoring(StaleElementReferenceException.class) 
        .until(new ExpectedCondition<WebElement>() { 
        public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
1

Angular porting与JAVA可能更适合您的情况。忽略页面状态和AJAX就绪事件并不是一个稳定的解决方案。你甚至可以通过JavascriptExecutor interfrace自己实现角度特定的等待。它允许你在代码中注入自定义JS,所以操纵浏览器。使用这样的:

long start = System.currentTimeMillis(); 
    ((JavascriptExecutor) driver).executeScript(
     "// your JS code here"); 

我用those slides时,我不得不这样做在Python,但JS代码保持不变。我们对这个解决方案非常满意。

1

自动化单页面应用程序(SPA)是一个新的挑战,它将推动Selenium WebDriver和相关框架的进一步改进。

在这种情况下,我从SerenityBDD借用的方法waitForAngularRequestsToFinish()

 
    public void waitForAngularRequestsToFinish() { 
     if ((boolean) getJavascriptExecutorFacade().executeScript("return (typeof angular !== 'undefined')? true : false;")) { 
       getJavascriptExecutorFacade().executeAsyncScript("var callback = arguments[arguments.length - 1];" + "angular.element(document.body).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);"); 
     } 
    } 

什么它使用JavascriptExecutor执行其通知或仅当存在正在处理没有未决角请求返回异步脚本基本上一样。

相关问题