将隐式等待和显式等待组合在一起会导致意外的等待时间

时间:2013-03-01 18:47:16

标签: ruby selenium selenium-webdriver webdriver

我的两个场景 -

1)首先

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}

这为驱动程序提供了45秒的搜索时间(预期)

2)第二次

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}

这现在让驱动程序 30秒来搜索文本(不是预期的)

有没有办法让硒等待explicit等待时间,而不是等待两者中的较大者?

注意 - 不会声明隐式等待时间不是一个选项,因为每次驱动程序无法找到某些内容时我都无法让selenium挂起。

使用Selenium版本30,windows,ff

2 个答案:

答案 0 :(得分:49)

不要混合隐式和显式等待。部分问题是隐式等待通常(但可能并非总是!)在WebDriver系统的“远程”端实现。这意味着它们已经“融入”IEDriverServer.exe,chromedriver.exe,安装到匿名Firefox配置文件中的WebDriver Firefox扩展以及Java远程WebDriver服务器(selenium-server-standalone.jar)。显式等待仅在“本地”语言绑定中实现。使用RemoteWebDriver时,事情变得复杂得多,因为您可能多次使用系统的本地和远程端。

这是如何工作的:本地代码 - > Java远程服务器 - >远程服务器上的本地Java语言绑定 - > “远程”组件,如Firefox扩展,chromedriver.exe或IEDriverServer.exe。它在网格情况下更加复杂,因为它们之间可能还有其他的跳跃。

因此,当您尝试混合隐式和显式等待时,您已经误入了“未定义的行为”。您可能能够弄清楚该行为的规则是什么,但随着驱动程序的实现细节发生变化,它们可能会发生变化。所以不要这样做。

如果您没有使用隐式等待,则在找不到元素时,您不应该遇到“挂起”。驱动程序应立即抛出NoSuchElement异常。

答案 1 :(得分:-2)

最佳做法是在每个测试开始时设置implicitlyWait(),并使用WebDriverWait()等待元素或加载AJAX元素。

但是,hiddenlyWait()和WebDriverWait()在同一测试中不能很好地协同工作。 你必须在调用WebDriverWait之前使implicitlyWait()无效,因为implicitlyWait()也设置了“driver.findElement()”等待时间。

每当你使用带有implicitlyWait()的WebDriverWait()时已经设置了一些初始值,请按照步骤 -

  1. 使用implicitlyWait()
  2. 无效
  3. 执行WebDriverWait(),并返回元素
  4. 再次重置hiddenlyWait()
  5. 示例Java代码 -

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() 
    
    WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
    element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
    
    driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_PAGE, TimeUnit.SECONDS);