哪个是使用selenium-webdriver处理等待和睡眠之间错误的更好选择?

时间:2013-03-15 12:07:57

标签: ruby selenium-webdriver

我们有时使用sleep(10)或有时使用如下:

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
element = wait.until { driver.find_element :name => "search" }
element = driver.find_element :name => "search"

根据我wait的说法,我们设置了最大超时时间,在此期间,如果找到元素(<10 seconds),我们将移动到下一行,如果再次找不到,我们也会移到下一行但是我在之前设定了10秒钟。

但是对于sleep()我们必须等待程序必须等待10 seconds如果所需的元素在该持续时间内加载或不加载。

两者通常用于基本上防止element not found错误。

现在我的问题是 -

  • waitsleep之间是否还有其他差异?

  • 哪一个更好的设计可以减少出错的几率?

  • 有没有更好的实现来处理这样的情况,我们可以有效地处理这样的element not found错误而不会使程序失败?

修改

对于最后一个问题,我发现了一个最小风险代码如下:

while true

 # do nothing

next if !(driver.title.include? "Buyer Home")

 driver.find_element(:link, "search").click
 break

end

1 个答案:

答案 0 :(得分:1)

在进入下一行方面,

wait.untilsleep不同。如果在指定的时间范围内找不到块(找到元素),wait.until将抛出异常。

这两种方法有同样的机会减少错误。如果您的睡眠或超时设置为30秒并且页面花费35秒加载元素,则两者都将遇到错误(尽管对于不同的行)。 wait.until的要点是,如果加载页面只需5秒钟,您就不必总是等待30秒。

我不确定哪种实施方式比wait.until更好。如果找不到该元素,程序将失败。立即失败更有意义,而不是等到以后依赖于该字段存在的东西运行时。

<强>更新

根据评论,我会重写

while true
  # do nothing
  next if !(driver.title.include? "Buyer Home")

  driver.find_element(:link, "search").click
  break
end

作为

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
wait.until { driver.title.include? "Buyer Home" }
driver.find_element(:link, "search").click