2013-08-05 100 views
1

等待元素出现在网页上的最佳方式是什么?我已经读过,我们可以使用隐式等待和函数,如webdriverwait,fluentwait等,最后但不是最少的thread.sleep()...我使用最多,但要停止使用。等待使用Selenium webdriver的元素

我的情景:在一个网站

用户登录...网站检查证书,并在覆盖(一种弹出,但不是一个单独的窗口)的形式提供的报价给用户。我需要验证叠加层上的文字。 用户登录和显示叠加层之间存在时间差。什么是最好的方法,以便硒等待直到元素不可见为止。由于叠加层不是单独的页面,而是主页面的一部分,所以隐式等待根本不起作用。

欢迎您提出任何建议... :)

+0

我会建议流利的等待,因为它使很多在平时间和控制总工期的。但隐含的等待也应该起作用,除非你指定的时间很少。可能你正在检查元素的存在,并且代码正在破坏。 – Vinay

+0

我会推荐使用webdriverwait或fluentwait。我不喜欢隐含的等待,而且我绝对不喜欢sleep(),因为这两者往往会导致无需等待。有相当ExpectedConditions,你可以用wait.until()等待 –

回答

0

始终使用隐式等待启动。我认为Selenium默认为5秒,所以如果你做了一个driver.findElement(),暗示它会等待5秒钟。这应该做到这一点。如果您遇到这种情况所花费的时间是不可预知的,那么请使用FluentWait(具有相同的5秒超时),但也可以使用.ignoring方法,并在while循环内包装它。这里的基本思想是:

int tries=0; 
while (tries < 3) { 
    //fluent wait (with .ignoring) inside here 
    tries ++1; 
} 
0
WebDriverWait wait = new WebDriverWait(driver, 20); 
wait.until(ExpectedConditions.elementToBeClickable(By.id("optionsBuilderSelect_input"))); 

我是一个专业的刮板(http://nitinsurana.com)我已经写了使用硒30+的软件,我从来没有遇到任何问题,这样,反正上面是一个示例代码。

所有我能想到的是,除非条件必须被检查,因为许多时间元素已经可见,但它们不是可点击的,而且类似的东西。我想你应该尝试不同的选择,我希望你会找到需要的。

0
public boolean waitForElement(WebElement ele, String xpath, int seconds) throws InterruptedException{ 
    //returns true if the xpath appears in the webElement 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; 
} 
0

你可以等待元素的存在显示如下:

new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("someId"))); 
相关问题