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

Ame*_*mey 12 ruby selenium webdriver selenium-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")}
Run Code Online (Sandbox Code Playgroud)

这给了驱动程序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")}
Run Code Online (Sandbox Code Playgroud)

这现在为驱动程序提供了30秒的搜索时间(不是预期的)

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

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

使用Selenium版本30,windows,ff

Jim*_*ans 50

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

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

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

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