【发布时间】:2016-06-21 12:05:53
【问题描述】:
我正在尝试自动化具有 AJAX 加载程序的应用程序。当我尝试单击元素并装载机当时处于活动状态。该元素不可访问。
我已经为 click() 创建了一个包装器方法,它确保 AJAX 完成并且可以单击元素。
我尝试了 jQuery.active === 0。但是,在那之后,由于加载程序,它也失败了。
所以,我在包装方法中使用了 isElementPresent 作为加载器。但是,这需要花费大量时间。 isElementPresent 需要 6-8 秒。我为加载器尝试了 className、cssSelector。但是,没有运气。
下面是我的代码:
public void WaitForAjax() throws InterruptedException {
while (true) {
Boolean ajaxIsComplete = (Boolean) ((JavascriptExecutor) driver)
.executeScript("return (document.readyState == 'complete') && (jQuery.active === 0);");
if (ajaxIsComplete) {
if (isElementPresent(By.className("z-loading-indicator"))) {
continue;
} else {
break;
}
}
Thread.sleep(100);
}
}
public void clickElement(WebElement element) throws InterruptedException {
WaitForAjax();
Thread.sleep(500);
waitForElementVisible(element);
waitForElementClickable(element);
element.click();
}
请帮忙!
【问题讨论】:
-
你应该尝试
ExpectedConditions.invisibilityOfElementLocated而不是所有这些.. -
当你说“引发错误”时,说出错误是什么总是有用的。
-
@apokryfos:更新了问题。
-
@SaurabhGaur:已经试过了。点击也需要6-8秒。 :(
-
您真的不想将所有这些等待链接在一起,而且绝对不是每次点击。这很可能是你所有时间都被浪费的地方。我会避免像 clickElement() 这样的过于通用的函数。 WaitForAjax() 显然不起作用,或者您不需要所有其他等待。我建议您找到指示 AJAX 部分已完成的元素状态。等待它出现,然后你就知道 AJAX 已经完成了。例如,一个元素出现或消失等。
标签: javascript java jquery ajax selenium-webdriver