我正在尝试构建一种更好的方法,以便在每次单击后等待页面加载。 我现在使用的是:
public boolean waitForJSandJQueryToLoad() {
WebDriverWait wait = new WebDriverWait(webDriver, EnvironmentUtils.getPageLoadTimeout().intValue());
// wait for jQuery to load
ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
if (!((Boolean) callJS("return (window.jQuery != null) && (jQuery.active === 0);"))) {
log.info("JQUERY.ACTIVE IS WORKING AT THE MOMENT! jQuery.active= " + callJS("return jQuery.active"));
}
return (Boolean) callJS("return (window.jQuery != null) && (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) {
if (!callJS("return document.readyState").toString().equals("complete")) {
log.info("document.readyState is not complete at the moment! status is->" + callJS("return document.readyState").toString());
}
return callJS("return document.readyState").toString().equals("complete");
}
};
ExpectedCondition<Boolean> animationLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
if (!callJS("return $(\":animated\").length").toString().equals("0")) {
log.info("Animation is currently executing on-page. value ->" + callJS("return $(\":animated\").length").toString());
}
return callJS("return $(\":animated\").length").toString().equals("0");
}
};
return wait.until(jQueryLoad) && wait.until(jsLoad) && wait.until(animationLoad);
}
在某些情况下,单击某个按钮并等待表后加载但我运行countRowsInTable方法(通过selenium命令计算表中的行)时,我的测试仍然失败,它会显示零,而实际的视觉效果不是零点,计数行的命令工作正常,如果要检查它,请输入代码:
public int countDisplayedRowsInTable(String tableId) {
waitForJSandJQueryToLoad();
int count = 0;
List<WebElement> rows = webDriver.findElements(By.xpath("//table[@id='" + tableId + "']/tbody/tr"));
for (WebElement row : rows) {
if (row.isDisplayed())
count++;
}
return count;
}
我很确定我用waitForJSandJQueryToLoad方法覆盖任何东西,我希望你可以给我一些额外的声明,也许我错过了。 提前谢谢。
答案 0 :(得分:0)
我认为您可以定义一个显式等待,等待某个条件发生,然后再继续执行代码。
public int countDisplayedRowsInTable(String tableId) {
String e = "//table[@id='" + tableId + "']";
// Wait for the table to load
WebElement table = (new WebDriverWait(driver, intCustomWait))
.until(ExpectedConditions.elementToBeClickable(By.xpath(e));
// Get all the rows from within the table
List<WebElement> rows = table.findElements(By.xpath("./tbody/tr"));
if(rows.size() > 0)
{
int count = 0;
for (WebElement row : rows) {
if (row.isDisplayed())
count++;
}
return count;
}
else return -1;
}