2011-05-28 50 views
2

我正在使用Selenium2(2.0-b3)web驅動程序 我想等待頁面上存在元素。我可以像下面這樣寫,它工作正常。Selenium2等待頁面上的特定元素

但我不想爲每個頁面放置這些塊。

// Wait for search to complete 
     wait.until(new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver webDriver) { 
       System.out.println("Searching ..."); 
       return webDriver.findElement(By.id("resultStats")) != null; 
      } 
     }); 

我想將它轉換成一個功能,我可以通過elementid和功能等待指定的時間和返回我的基礎元素假假真真發現還是不行。

公共靜態布爾waitForElementPresent(webdriver的驅動程序,字符串elementId,INT noOfSecToWait){

}

我讀等待不返回,直到頁面加載等,但我想寫上述方法這樣我就可以點擊鏈接到一個頁面,並在我對頁面進行任何操作之前調用waitForElementPresent方法來等待下一頁中的元素。

你能幫我寫下這個方法嗎,我遇到了問題,因爲我不知道如何重構上述方法以便能夠傳遞參數。

感謝 邁克

回答

3

這是我如何做,在C#(檢查每一個250毫秒的元素出現):

private bool WaitForElementPresent(By by, int waitInSeconds) 
{ 
var wait = waitInSeconds * 1000; 
    var y = (wait/250); 
    var sw = new Stopwatch(); 
    sw.Start(); 

    for (var x = 0; x < y; x++) 
    { 
     if (sw.ElapsedMilliseconds > wait) 
      return false; 

     var elements = driver.FindElements(by); 
     if (elements != null && elements.count > 0) 
      return true; 
     Thread.Sleep(250); 
    } 
    return false; 
} 

這樣調用該函數:

bool found = WaitForElementPresent(By.Id("resultStats"), 5); //Waits 5 seconds 

這有幫助嗎?

2

你可以這樣做,新的一類,並添加下面的方法:

public WebElement wait4IdPresent(WebDriver driver,final String elementId, int timeOutInSeconds){ 

    WebElement we=null; 
    try{ 
     WebDriverWait wdw=new WebDriverWait(driver, timeOutInSeconds); 

     if((we=wdw.until(new ExpectedCondition<WebElement>(){ 
      /* (non-Javadoc) 
      * @see com.google.common.base.Function#apply(java.lang.Object) 
      */ 
      @Override 
      public WebElement apply(WebDriver d) { 
       // TODO Auto-generated method stub 
       return d.findElement(By.id(elementId)); 
      } 
     }))!=null){ 
      //Do something; 
     } 
    }catch(Exception e){ 
     //Do something; 
    } 
    return we; 

} 

不要試圖實現接口ExpectedCondition <>,這是一個壞主意。我之前遇到過一些問題。 :)

0

here

WebElement myDynamicElement = (new WebDriverWait(driver, 10)) 
    .until(new ExpectedCondition<WebElement>(){ 
    @Override 
    public WebElement apply(WebDriver d) { 
     return d.findElement(By.id("myDynamicElement")); 
    }});