Java 我们是否有任何通用函数来检查页面是否已在Selenium中完全加载

Java 我们是否有任何通用函数来检查页面是否已在Selenium中完全加载,java,selenium,selenium-webdriver,pageload,dom-events,Java,Selenium,Selenium Webdriver,Pageload,Dom Events,我试图在selenium中检查网页是否加载完成(即检查是否加载了所有控件) 我尝试了以下代码: new WebDriverWait(firefoxDriver, pageLoadTimeout).until( webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); 但即使页面正在加载,上面的代码也不会等待

我试图在selenium中检查网页是否加载完成(即检查是否加载了所有控件)

我尝试了以下代码:

new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
          webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
但即使页面正在加载,上面的代码也不会等待


我知道我可以检查特定元素,以检查其是否可见/可单击等,但我正在寻找一些通用解决方案

我也使用selenium,我也遇到了同样的问题,为了解决这个问题,我只需等待jQuery加载

因此,如果您有相同的问题,请尝试此方法

((Long) ((JavascriptExecutor) browser).executeScript("return jQuery.active") == 0);

您可以将这两个函数包装在一个方法中并进行检查,直到页面和jQuery都被加载

我也使用selenium,我也遇到了同样的问题,为了解决这个问题,我只需等待jQuery加载即可

因此,如果您有相同的问题,请尝试此方法

((Long) ((JavascriptExecutor) browser).executeScript("return jQuery.active") == 0);

您可以将这两个函数包装在一个方法中并进行检查,直到页面和jQuery都被加载。

实现这一点,它对包括我在内的许多人都有效。它包括网页等待JavaScript、Angular、JQuery(如果有)

如果您的应用程序包含Javascript和JQuery,那么您只能为它们编写代码

通过在单个方法中定义它,您可以在任何地方调用它:

          // Wait for jQuery to load
          {             
            ExpectedCondition<Boolean> jQueryLoad = driver -> ((Long) ((JavascriptExecutor) driver).executeScript("return jQuery.active") == 0);

            boolean jqueryReady = (Boolean) js.executeScript("return jQuery.active==0");

            if (!jqueryReady) {
                // System.out.println("JQuery is NOT Ready!");
                wait.until(jQueryLoad);
            }
            wait.until(jQueryLoad);
          }

          // Wait for ANGULAR to load
          {               
            String angularReadyScript = "return angular.element(document).injector().get('$http').pendingRequests.length === 0";

            ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver).executeScript(angularReadyScript).toString());

            boolean angularReady = Boolean.valueOf(js.executeScript(angularReadyScript).toString());

            if (!angularReady) {
                // System.out.println("ANGULAR is NOT Ready!");
                wait.until(angularLoad);
            }
          }

          // Wait for Javascript to load    
          {             
            ExpectedCondition<Boolean> jsLoad = driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").toString()
                    .equals("complete");

            boolean jsReady = (Boolean) js.executeScript("return document.readyState").toString().equals("complete");

            // Wait Javascript until it is Ready!
            if (!jsReady) {
                // System.out.println("JS in NOT Ready!");
                wait.until(jsLoad);
            }
          }
//等待jQuery加载
{             
ExpectedCondition jQueryLoad=driver->((长)((JavascriptExecutor)driver).executeScript(“return jQuery.active”)==0);
boolean jqueryReady=(boolean)js.executeScript(“return jQuery.active==0”);
如果(!jqueryReady){
//System.out.println(“JQuery还没有准备好!”);
等到(jQueryLoad);
}
等到(jQueryLoad);
}
//等待角度加载
{               
String angularReadyScript=“return angular.element(document.injector().get(“$http”).pendingRequests.length==0”;
ExpectedCondition angularLoad=driver->Boolean.valueOf((JavascriptExecutor)driver.executeScript(angularReadyScript.toString());
boolean angularReady=boolean.valueOf(js.executeScript(angularReadyScript.toString());
如果(!angularReady){
//System.out.println(“角度未准备就绪!”);
等待。直到(角度负载);
}
}
//等待Javascript加载
{             
ExpectedCondition jsLoad=driver->((JavascriptExecutor)driver).executeScript(“return document.readyState”).toString()
.等于(“完全”);
boolean jsReady=(boolean)js.executeScript(“return document.readyState”).toString().equals(“complete”);
//等待Javascript,直到它准备好!
如果(!jsReady){
//System.out.println(“JS-in-notready!”);
等待.直到(jsLoad);
}
}

如果你在实施过程中遇到任何困难,请告诉我


它克服了线程或显式等待的使用。

实现这一点,它适用于包括我在内的许多人。它包括网页等待JavaScript、Angular、JQuery(如果有)

如果您的应用程序包含Javascript和JQuery,那么您只能为它们编写代码

通过在单个方法中定义它,您可以在任何地方调用它:

          // Wait for jQuery to load
          {             
            ExpectedCondition<Boolean> jQueryLoad = driver -> ((Long) ((JavascriptExecutor) driver).executeScript("return jQuery.active") == 0);

            boolean jqueryReady = (Boolean) js.executeScript("return jQuery.active==0");

            if (!jqueryReady) {
                // System.out.println("JQuery is NOT Ready!");
                wait.until(jQueryLoad);
            }
            wait.until(jQueryLoad);
          }

          // Wait for ANGULAR to load
          {               
            String angularReadyScript = "return angular.element(document).injector().get('$http').pendingRequests.length === 0";

            ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver).executeScript(angularReadyScript).toString());

            boolean angularReady = Boolean.valueOf(js.executeScript(angularReadyScript).toString());

            if (!angularReady) {
                // System.out.println("ANGULAR is NOT Ready!");
                wait.until(angularLoad);
            }
          }

          // Wait for Javascript to load    
          {             
            ExpectedCondition<Boolean> jsLoad = driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").toString()
                    .equals("complete");

            boolean jsReady = (Boolean) js.executeScript("return document.readyState").toString().equals("complete");

            // Wait Javascript until it is Ready!
            if (!jsReady) {
                // System.out.println("JS in NOT Ready!");
                wait.until(jsLoad);
            }
          }
//等待jQuery加载
{             
ExpectedCondition jQueryLoad=driver->((长)((JavascriptExecutor)driver).executeScript(“return jQuery.active”)==0);
boolean jqueryReady=(boolean)js.executeScript(“return jQuery.active==0”);
如果(!jqueryReady){
//System.out.println(“JQuery还没有准备好!”);
等到(jQueryLoad);
}
等到(jQueryLoad);
}
//等待角度加载
{               
String angularReadyScript=“return angular.element(document.injector().get(“$http”).pendingRequests.length==0”;
ExpectedCondition angularLoad=driver->Boolean.valueOf((JavascriptExecutor)driver.executeScript(angularReadyScript.toString());
boolean angularReady=boolean.valueOf(js.executeScript(angularReadyScript.toString());
如果(!angularReady){
//System.out.println(“角度未准备就绪!”);
等待。直到(角度负载);
}
}
//等待Javascript加载
{             
ExpectedCondition jsLoad=driver->((JavascriptExecutor)driver).executeScript(“return document.readyState”).toString()
.等于(“完全”);
boolean jsReady=(boolean)js.executeScript(“return document.readyState”).toString().equals(“complete”);
//等待Javascript,直到它准备好!
如果(!jsReady){
//System.out.println(“JS-in-notready!”);
等待.直到(jsLoad);
}
}

如果你在实施过程中遇到任何困难,请告诉我


它克服了线程或显式等待的使用。

如您所述,如果有任何通用函数来检查页面是否已完全加载,则答案为“否”

首先让我们看看您的代码试用版,如下所示:

new WebDriverWait(firefoxDriver, pageLoadTimeout).until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
public void WaitForAjax2Complete() throws InterruptedException
{
    while (true)
    {
        if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){
            break;
        }
        Thread.sleep(100);
    }
}
driver.get("https://www.google.com/");
new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("partial_title_of_application_under_test"));
System.out.println(driver.getTitle());
driver.quit();
driver.get("https://www.google.com/");
WebElement ele = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_of_the_desired_element")));
System.out.println(ele.getText());
driver.quit();
上面代码行中的参数
pageLoadTimeout
实际上不会重新编译为实际值

在这里,您可以找到关于


现在,由于您的用例与完全加载的页面相关,您可以通过DesiredCapabilities类或ChromeOptions类的实例使用设置为
正常
[支持的值为无,急切或正常]:

new WebDriverWait(firefoxDriver, pageLoadTimeout).until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
public void WaitForAjax2Complete() throws InterruptedException
{
    while (true)
    {
        if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){
            break;
        }
        Thread.sleep(100);
    }
}
driver.get("https://www.google.com/");
new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("partial_title_of_application_under_test"));
System.out.println(driver.getTitle());
driver.quit();
driver.get("https://www.google.com/");
WebElement ele = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_of_the_desired_element")));
System.out.println(ele.getText());
driver.quit();
  • 使用DesiredCapabilities类:

  • 使用ChromeOptions类:

您可以在中找到详细的讨论


现在将PageLoadStrategy设置为