我的两个场景 -
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
答案 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()时已经设置了一些初始值,请按照步骤 -
示例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);