我正在使用 selenium 来测试 AngularJS 应用程序。我面临的问题是,在页面完全加载之前,我无法在页面上执行任何操作。我可以放置 Thread.sleep(),但据我所知,这不是一个好的解决方案。有很多方法可以等待页面加载(我用谷歌搜索),但我想我已经尝试了所有方法,但仍然没有运气。在我的应用程序中,当访问网页时,所有内容看起来都已加载(从视觉角度来看),但在整个页面加载(大约 1 秒)之前我无法执行任何活动。
你们能分享一下您的实现方式吗?它实际上是有效的
谢谢
My code:
public By ngWait(final By by) {
return new FluentBy() {
@Override
public void beforeFindElement(WebDriver driver) {
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
((JavascriptExecutor) driver).executeAsyncScript("var callback = arguments[arguments.length - 1];" +
"angular.element(document.body).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);");
super.beforeFindElement(driver);
}
@Override
public List<WebElement> findElements(SearchContext context) {
return by.findElements(context);
}
@Override
public WebElement findElement(SearchContext context) {
return by.findElement(context);
}
@Override
public String toString() {
return "ngWait(" + by.toString() + ")";
}
};
}
我在使用 Selenium 针对 Angular 应用程序编写测试时遇到了类似的情况。实际上,在角度应用程序中,页面的骨架或视图会立即加载,但它会不断调用$http
在后台请求获取数据。一旦角度应用程序完成$http
调用,它使用 $http 调用的响应来渲染视图。因此,有一个经典的 selenium 等待waitUntilPageToBeLoad
, waitUntilElementToBeClickable
根本不在这里工作。另一个解决方案是Thread.Sleep()
但正如你所提到的,这不是一个明智的等待。
那么为什么不使用 wait 方法来确保$http
通话在后台完成。您可以尝试下面的等待方法,它对我有用。我希望它也对您有用!
public void untilAngularFinishHttpCalls() {
final String javaScriptToLoadAngular =
"var injector = window.angular.element('body').injector();" +
"var $http = injector.get('$http');" +
"return ($http.pendingRequests.length === 0)";
ExpectedCondition<Boolean> pendingHttpCallsCondition = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor) driver).executeScript(javaScriptToLoadAngular).equals(true);
}
};
WebDriverWait wait = new WebDriverWait(driver, 20); // timeout = 20 secs
wait.until(pendingHttpCallsCondition);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)