17

我的两种情况-

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

4

2 回答 2

59

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

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

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

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

于 2013-03-02T13:24:22.223 回答
-2

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

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

每当您使用 WebDriverWait() 和 implicitlyWait() 已经设置了一些初始值时,请按照以下步骤操作 -

  1. 取消隐式Wait()
  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); 
于 2013-09-04T09:48:46.347 回答