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

Posted

技术标签:

【中文标题】Selenium Webdriver - 等待页面在 Java 和 JavaScript 中完全加载(ajax/jquery/animation 等)【英文标题】:Selenium Webdriver - wait for page to completely load in Java&JavaScript(ajax/jquery/animation etc.) 【发布时间】:2016-11-14 23:48:38 【问题描述】:

我正在尝试构建一种更好的方法来等待每次点击后加载页面。 目前我使用的是这样的:

    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 方法涵盖了所有内容,我希望你能给我额外的声明,我可能错过了。 提前致谢。

【问题讨论】:

能否提供应用程序或应用程序的任何特定框架的链接? 对不起,我不被允许。你能告诉我你在找什么吗? 而不是检查所有这些条件来确定每次单击后会发生什么......比如是否正在运行任何加载程序图标或正在显示某些文本。如果是这样,请等待该元素可见/不可见......并且我们如何检查您的功能是否正常工作。它可能适用于某些网站,但不适用于其他网站或您的应用程序..您至少可以告诉构建应用程序的框架[angular-js,ext-js ..) 我已经尝试过使用 element visible ,它没有帮助,因为该元素是可见的,但是在搜索时需要加载它。 是表 jquery-datatable 还是 jtable 或任何其他表框架 【参考方案1】:

我认为您可以定义一个显式等待,等待特定条件发生,然后再继续编写代码。

    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;
    

【讨论】:

感谢您的评论,我已尝试查看表格的 ExpectedConditions.elementToBeClickable By.id 是否有效,但似乎不起作用。根据 ajax/jquery 加载的 html 代码。但同样,我尝试使用我的 waitForJSandJQueryToLoad,也许我确实需要结合这两种方法才能使其工作。 嘿,我刚刚尝试了您的方法,但它不起作用,因为在表格没有行但仍显示的情况下,在 X 秒等待元素可点击后超时。 elementToBeClickable 目前似乎无法解决问题,谢谢。

以上是关于Selenium Webdriver - 等待页面在 Java 和 JavaScript 中完全加载(ajax/jquery/animation 等)的主要内容,如果未能解决你的问题,请参考以下文章

Selenium with Python 008 - WebDriver 元素等待

selenium webdriver显示等待时间

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

selenium之webdriver详解——小白进阶之路(二)

webdriver sendKeys 不等待页面加载

selenium 设置元素等待