Java 我们是否有任何通用函数来检查页面是否已在Selenium中完全加载
我试图在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")); 但即使页面正在加载,上面的代码也不会等待
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设置为