0

我们有时使用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基本防止错误。

现在我的问题是——

  • wait和 之间还有什么区别sleep吗?

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

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

编辑

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

while true

 # do nothing

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

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

end
4

1 回答 1

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
于 2013-03-15T14:21:38.123 回答