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

我的两个场景 –

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秒来search文本(这是预期的)

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秒来search文本(不是预期的)

有没有办法使selenium只能等待explicit等待时间,而不是等待更长的时间?

注意 – 不声明隐含的等待时间不是一个选项,因为我不能让selenium挂起每次司机无法find的东西。

使用Selenium版本30,windows,ff

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

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

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

如果不使用隐式等待,则不应该遇到元素无法find的情况。 驱动程序应立即抛出NoSuchElementexception。

最好的做法是在每个testing开始时设置implicitlyWait(),并使用WebDriverWait()等待一个元素,或者加载AJAX元素。

但是,隐式地Wait()和WebDriverWait()在相同的testing中不能很好地协同工作。 你必须在调用WebDriverWait之前隐式地voidWait(),因为implicitlyWait()也设置了“driver.findElement()”的等待时间。

每当您使用WebDriverWait()与隐式地Wait()已经设置了一些初始值,请按照步骤 –

  1. 隐式地取消等待()
  2. 执行WebDriverWait(),并返回元素
  3. 隐式重置Wait()

示例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);