我的两种情况-
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秒的时间 来搜索文本(不需要)
有没有一种方法可以让selenium仅explicit等待等待时间,而不等待两者中的较大者?
explicit
注意-不声明隐式等待时间不是一种选择,因为每次驱动程序无法找到东西时,我都无法让selenium挂起。
使用Selenium版本30,Windows,ff
不要混合使用隐式和显式等待。问题的部分原因是隐式等待通常(但可能并不总是!)在WebDriver系统的“远程”侧实现。这意味着它们被“嵌入”到IEDriverServer.exe,chromedriver.exe,安装在匿名Firefox配置文件中的WebDriver Firefox扩展以及Java远程WebDriver服务器(selenium-server- standalone.jar)。显式等待专门在“本地”语言绑定中实现。使用RemoteWebDriver时,事情变得更加复杂,因为您可能同时使用了系统的本地端和远程端。
这就是它的工作方式:本地代码-> Java远程服务器->远程服务器上的本地Java语言绑定->“远程”组件,例如Firefox扩展,chromedriver.exe或IEDriverServer.exe。在网格情况下,它甚至更加复杂,因为它们之间可能还有其他跃点。
因此,当您尝试将隐式等待和显式等待混合使用时,就会迷失为“未定义行为”。您可能能够弄清楚该行为的规则是什么,但是随着驱动程序的实现细节的更改,它们可能会有所更改。所以不要这样做。
如果您不使用隐式等待,则在找不到元素时不应出现“挂起”现象。驱动程序应立即引发NoSuchElement异常。