Selenium 2等到JAVA完成AJAX

时间:2015-06-28 17:16:43

标签: java unit-testing selenium selenium-webdriver

我使用 Selenium 2 Java 1.7 。 我想等待 HtmlUnitDriver ,直到我点击过滤器按钮完成ajax。

我的司机:

Webdriver driver = new HtmlUnitDriver(true);

过滤按钮并点击操作:

WebElement weFilterButton = driver.findElement(By.name("filterButton"));
weFilterButton.click();

我尝试了三种等待AJAX​​的方法。

第一

WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ctl00_ContentPlaceHolder1_Reports1_ajaxloadingImage"))); 

第二

Boolean el = wait.until(new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver driver) {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        return (Boolean) js.executeScript("return document.readyState").toString().equals("complete");
    }
});

虽然这不是一个好的解决方案

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

但不起作用。

修改

Selenium依赖是:

<dependency>
     <groupId>org.seleniumhq.selenium</groupId>
     <artifactId>selenium-java</artifactId>
     <version>2.45.0</version>
</dependency> 

3 个答案:

答案 0 :(得分:1)

使用以下代码。它检查JQuery是否处于活动状态并等待它处于活动状态。

Boolean isJqueryUsed = (Boolean)((JavascriptExecutor)driver).executeScript("return (typeof(jQuery) != 'undefined')"));
if(isJqueryUsed){
  while (true){
    // JavaScript test to verify jQuery is active or not
    Boolean ajaxIsComplete = (Boolean)(((JavascriptExecutor)driver).executeScript("return jQuery.active == 0"));
    if (ajaxIsComplete) break;
    try{
      Thread.sleep(100);
    }catch (InterruptedException e) {}
  }
}

答案 1 :(得分:0)

主要问题是你点击之后你必须等待ajax加载不可见不可见。这意味着你必须等待元素消失或隐藏。

你可以在ExpectedConditions中使用not来实现这一点。它将返回一个布尔类型。如果确实你可以继续.Else增加等待时间,看看..

 WebDriverWait wait = new WebDriverWait(driver, 60);
   Boolean present = wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(By.id("ctl00_ContentPlaceHolder1_Reports1_ajaxloadingImage"))));

答案 2 :(得分:0)

尝试使用&#34;返回Ajax.activeRequestCount == 0&#34;