Selenium2等待页面上的特定元素

时间:2011-05-28 06:33:47

标签: wait webdriver selenium-webdriver

我正在使用Selenium2(2.0-b3)网络驱动程序 我想等待一个元素出现在页面上。我可以像下面这样写,它工作正常。

但我不想把这些块放在每一页上。

// 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并且函数等待指定的时间,并根据元素的查找返回我的错误。

public static boolean waitForElementPresent(WebDriver driver,String elementId,int noOfSecToWait){

}

我正在阅读等待不会返回,直到页面加载等,但我想写上面的方法,以便我可以点击链接到页面并调用waitForElementPresent方法等待下一页中的元素,然后我做任何事情与页面。

请你帮我写一下这个方法,因为我不知道怎么重构上面的方法才能传递参数。

由于 麦克

3 个答案:

答案 0 :(得分: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

这有帮助吗?

答案 1 :(得分: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&lt;&gt;,这是一个坏主意。我之前遇到了一些问题。 :)

答案 2 :(得分:0)

来自here

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