我被困在我希望我的脚本等待ajax请求完成的位置。
我试过了: 1.在慢速网络模式下运行应用程序,单击“创建”按钮并选中JQuery.active返回1.仅发生ajax调用。
问题是整页没有刷新。只是页面上的一些数据每次都会更新。
我使用显式等待,直到加载程序/进度条消失,但我被要求专门等待ajax完成,因为UI可能很快就会改变。
我尝试了实施:
public boolean waitForJSandJQueryToLoad() {
WebDriverWait wait = new WebDriverWait(driver, 30);
// wait for jQuery to load
ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0);
}
catch (Exception e) {
// no jQuery present
return true;
}
}
};
// wait for Javascript to load
ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState")
.toString().equals("complete");
}
};
return wait.until(jQueryLoad) && wait.until(jsLoad);
}
但它不起作用。我的测试失败了,因为在ajax完成和数据更新之前调用了断言。
有人可以给我解决方案: 1.检查AJAX是否正在运行。 2.等到ajax完成。 3.等待数据更新/刷新,而不是整页。
谢谢!
答案 0 :(得分:2)
这是我用来等待Ajax完成的代码:
public static void waitForAjaxToFinish() {
WebDriverWait wait = new WebDriverWait(driver, 5000);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver wdriver) {
return ((JavascriptExecutor) driver).executeScript("return jQuery.active == 0").equals(true);
}
});
}
和我用来等待JQuery活动的代码:
public static void waitForJQueryToBeActive() {
Boolean isJqueryUsed = (Boolean) ((JavascriptExecutor) driver)
.executeScript("return (typeof(jQuery) != 'undefined')");
if (isJqueryUsed) {
while (true) {
// JavaScript test to verify jQuery is active or not
Boolean ajaxIsComplete = (Boolean) (((JavascriptExecutor) driver)
.executeScript("return jQuery.active == 0"));
if (ajaxIsComplete)
break;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
希望这有帮助。