简体   繁体   English

Selenium Webdriver - 等待页面完全加载Java和JavaScript(ajax / jquery / animation等)

[英]Selenium Webdriver - wait for page to completely load in Java&JavaScript(ajax/jquery/animation etc.)

I am trying to build a better method for waiting for a page to load after each click. 我正在尝试构建一个更好的方法来等待每次单击后加载页面。 At the moment what i have used is this: 我现在使用的是这个:

    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);
}

in some cases my tests still fails after clicking on some button and waiting for a table to load afterwards but when I ran countRowsInTable method(which count rows in a table by selenium command) it brings out zero while the actual visual is not zero at all, the command of count rows is working properly, here's the code if you want to check it: 在某些情况下我的测试仍然失败,点击一些按钮并等待一个表后加载,但当我运行countRowsInTable方法(通过selenium命令计算表中的行)时,它会显示零,而实际的视觉效果根本不为零,count行的命令工作正常,如果要检查它,这是代码:

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;
}

I am pretty sure that i covered anything with my waitForJSandJQueryToLoad method, i hope that you may give me additional statement that maybe i missed. 我很确定我用waitForJSandJQueryToLoad方法覆盖任何东西,我希望你可以给我一些额外的声明,也许我错过了。 Thanks in advance. 提前致谢。

I think you can define an explicit wait that waits for a certain condition to occur before moving on in the code. 我认为您可以定义一个显式等待,等待某个条件发生,然后再继续执行代码。

    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;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM