如何在angular.js应用程序中等待Element可见?

时间:2017-05-24 21:10:37

标签: java angularjs selenium-webdriver wait page-load-time

我觉得这似乎是一个很老的问题。但实际上并不适合我。

我的申请基于Angular。在Loader出现时立即登录应用程序,Selenium测试失败并引发下面提到的错误异常。

 unknown error: Element <a id="user_dropdown" href="javascript:void(0);" class="dropdown-toggle" data-toggle="dropdown">...</a> is not clickable at point (1421, 33). Other element would receive the click: <md-backdrop ng-show="showMainSpinner" class="m-backdrop" aria-hidden="false">...</md-backdrop>
  (Session info: chrome=58.0.3029.110)
(Driver info: chromedriver=2.28.455520 
(cc17746adff54984afff480136733114c6b3704b),platform=Windows NT 10.0.14393 
x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 56 milliseconds
 Build info: version: '2.45.0', revision: 
 '5017cb8e7ca8e37638dc3091b2440b90a1d8686f', time: '2015-02-27 09:10:26'
[Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities \[{applicationCacheEnabled=false, rotatable=false, 
mobileEmulationEn][1]abled=false, networkConnectionEnabled=false, chrome=
 {chromedriverVersion=2.28.455520 
(cc17746adff54984afff480136733114c6b3704b), 
userDataDir=C:\Users\smistry\AppData\Local\Temp\scoped_dir56852_17781}, 
 takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, 
handlesAlerts=true, hasTouchScreen=false, version=58.0.3029.110,         
platform=XP, browserConnectionEnabled=false, nativeEvents=true, 
 acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, 
browserName=chrome, takesScreenshot=true, javascriptEnabled=true, 
cssSelectorsEnabled=true, unexpectedAlertBehaviour=}]
Session ID: 41ebcec742d22c760f65efb4bb06b7db

到目前为止我为实现这一目标所做的事情:

1)使用隐式等待

2)使用显式等待(WaitForElementPresent / WaitForVisible / elementToBeClickable /等待元素的隐身等)(所有可能的尝试)

3)使用Java Script(window.angular.element('body')。injector()。get('$ http')。pendingRequests.length === 0)

typeof jQuery!='undefined'

document.readystate

typeof angular!='undefined')

4)尝试捕捉元素(Loader)的每种可能方式,并等待它消失。根本没用。

5)使用Thread.sleep(但我不想使用它)

以下是我网站Spinner元素的代码:

<md-progress-circular md-mode="indeterminate" md-diameter="70" class="m-spinner md-raised md-hue-2 md-mode-indeterminate" aria-valuemin="0" aria-valuemax="100" role="progressbar" style="width: 70px; height: 70px;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 70 70" style="width: 70px; height: 70px; transform-origin: 35px 35px 35px;"><path fill="none" style="stroke-width: 7px;" d="M21.583326164121,6.500125207614687A31.5,31.5 0 0,1 49.405589517818534,63.01301466540359"></path></svg></md-progress-circular>

我正在使用Selenium webdriver,chrome 58,eclipse neon.2,windows 10。

自上次这么多天以来一直努力寻求解决方案。我希望你能得到我的问题。如果遗漏任何东西,我可以提供详细信息。帮助将受到高度赞赏。

3 个答案:

答案 0 :(得分:1)

经过几周的努力,我找到了解决问题的方法。

感谢大家的支持和帮助,我发布下面的答案对我有用。

在这么多次之前,我已经分开试过了。但是这次我一起尝试了它们并且像魅力一样工作。

我已经使用显式等待并等待主页页面图标的页面和可见性中的“加载元素”不可见。

感谢。

    WebDriverWait wait = new WebDriverWait(webDriver, 10);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementOfHomePage")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("loaderElement")));

答案 1 :(得分:0)

  

3)使用Java Script(window.angular.element('body')。injector()。get('$ http')。pendingRequests.length === 0)

     

typeof jQuery!='undefined'

     

document.readystate

     

typeof angular!='undefined')

上面的错误,我可以说你的应用程序中没有加载角度js库

答案 2 :(得分:0)

我使用下面提到的代码来处理与AngularJS相关的加载问题。它没有获得待处理的请求长度,而是在 之后通知 ,没有未完成的请求。

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);");
    }
}

摘自PageObject类SerenityBDD