我觉得这似乎是一个很老的问题。但实际上并不适合我。
我的申请基于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。
自上次这么多天以来一直努力寻求解决方案。我希望你能得到我的问题。如果遗漏任何东西,我可以提供详细信息。帮助将受到高度赞赏。
答案 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。