我有一个需要自动化的有角度的网站。我计划使用Protractor,但是由于应用程序中有某些内容(不确定是否轮询,keepAlive或其他),protractor在第一个元素上测试了超时,但找不到它。但是,如果我使用waitforangularenabled(false)
,则可以正常工作。但是我几乎每个语句都必须使用await。
现在,我想知道在这种情况下它是否与在Java中使用硒一样好。有什么想法吗?
答案 0 :(得分:1)
If set to false, Protractor will not wait for Angular $http and $timeout tasks to complete before interacting with the browser. This can cause flaky tests, but should be used if, for instance, your app continuously polls an API with $timeout.
这是来自量角器文档中waitforangularenabled
的官方文档。
But if I use waitforangularenabled(false), then it works fine.
-因此,如果您遇到的问题是测试超时而未使用此标志,则表示在后台运行了一些摘要循环,这使量角器无法认为页面稳定足以测试。
I have to use await with almost every statement.
-建议这样做,但不是强制性的。请再次查看说明此问题的文档。如果将承诺管理器标志(SELENIUM_PROMISE_MANAGER
)设置为false
,则只有它不会使用Promise管理器。如果您将Jasmine与Protractor一起使用,则可以在不使用async/await
的情况下使用Protractor,因为Jasmine经过优化可处理此类与Promise相关的问题。请参阅here。
Now, I wonder if its as good as using selenium in Java in this scenario.
-IMO取决于您的选择和使用现有库的便利性。如果您能够使用Selenium和Java处理应用程序的异步行为,则应继续进行选择。
答案 1 :(得分:0)
angular的唯一问题是它等待特定的响应,但是仍然加载页面上的所有元素,因此执行失败。但是我已经在硒中创建了一些与量角器等待相同的方法。您可以使用这些。
public static void waitUntilAngular5Ready(){ 尝试{ Object angular5Check = jsExec.executeScript(“返回getAllAngularRootElements()[0] .attributes ['ng-version']”); 如果(angular5Check!= null){ Boolean angularPageLoaded =(Boolean)jsExec.executeScript(“ return window.getAllAngularTestabilities()。findIndex(x =>!x.isStable())=== -1”); System.out.println(angularPageLoaded +“ angularPageLoaded”); 如果(!angularPageLoaded){ poll(5);
waitForAngular5Load();
poll(5);
}
}
} catch (WebDriverException ignored) {
}
}
private static void waitForAngular5Load() {
String angularReadyScript = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1";
angularLoads(angularReadyScript);
}
private static void angularLoads(String angularReadyScript) {
try {
ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver)
.executeScript(angularReadyScript).toString());
boolean angularReady = Boolean.valueOf(jsExec.executeScript(angularReadyScript).toString());
if (!angularReady) {
jsWait.until(angularLoad);
}
} catch (WebDriverException ignored) {
}
}