2013-07-08 33 views
3

我正在开发项目,其中一切都保存在事件中,因此服务器需要一些时间来响应新数据。我使用Fluent等待使用ajax的页面,但是这个不使用任何ajax。所以我想刷新页面检查是否有新的项目,如果不再刷新。 Selenium 2如何实现这一目标?硒刷新

我这样做:

 def accountsAfterCreating = 0 
     while (accountsAfterCreating <= existingAccounts) { 
      driver.navigate().refresh() 
      WebElement table = wait.until(new Function<WebDriver, WebElement>() { 
       public WebElement apply(WebDriver driver) { 
        return driver.findElement(By.className("table")) 
       } 
      }) 
      accountsAfterCreating = table.findElements(By.className("amount")).size() 
     } 

是不是正确的方式?

回答

0

我想出了这样的答案。这是因为它是使用封闭

private boolean refreshUntil(Closure<Boolean> condition) { 
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(8, TimeUnit.SECONDS) 
     .pollingEvery(200, TimeUnit.MILLISECONDS) 
     .ignoring(NoSuchElementException) 
    wait.until(new Predicate<WebDriver>() { 
     boolean apply(WebDriver driver) { 
      driver.navigate().refresh() 
      if (condition()) { 
       return true 
      } 
      return false 
     } 
    }) 
    return true 
} 

,并调用此方法

refreshUntil { 
      accountsBeforeCreation + 1 == driver.findElements(By.tagName("tr"))).size() 
     } 
只在常规工作
2

使用明确的等待像这样在try catch块

尝试{

WebElement myDynamicElement = (new WebDriverWait(driver, 10)) 
    .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement"))); 
}

catch() 

{

driver.navigate().refresh() 
}

2

我通常使用这个方法来等待任何html标签。我们也可以指定等待时间。

public boolean waitForElement(WebElement ele, String xpath, int seconds) throws InterruptedException{ 
    //returns true if the element appears within the time 
    //false when timed out 
    int t=0; 
    while(t<seconds*10){ 
     if(ele.findElements(By.xpath(xpath)).size()>0) 
      return true; 
     else{ 
      Thread.sleep(100); 
      t++; 
      continue; 
     } 
    }  
    System.out.println("waited for "+seconds+"seconds. But couldn't find "+xpath+ " in the element specified"); 
    return false; 
}