我们有时使用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
答案 0 :(得分:1)
wait.until
与sleep
不同。如果在指定的时间范围内找不到块(找到元素),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