使用watir-webdriver,单击链接后如何等待页面加载?
目前正在使用:
sleep n
但这不理想,因为页面响应变化很大。
有没有一种方法可以测试页面是否已准备好或页面中是否存在某些元素?我知道在普通的Watir宝石中有Watir::Waiter.wait_until
或类似的东西,但在webdriver版本中看不到。
我不知道它们是否是最好的方法,但这是我如何等待更新div
以清除它:
while browser.div(:id=>"updating_div").visible? do sleep 1 end
这是我如何等待显示的内容:
until browser.div(:id=>"some_div").exists? do sleep 1 end
今天的发行版增加了一个可选的要求,该要求引入了一些用于等待元素的助手。这些(目前)在Watir 1.6中不可用,因此请注意是否同时使用两个库。
在Watir-webdriver Wiki中检查“ AJAX and waiting for elements”以获取更多信息。
最佳摘要位于“ Waiting”中。
简而言之:
require 'watir-webdriver'
b = Watir::Browser.start 'bit.ly/watir-webdriver-demo'
b.select_list(:id => 'entry_1').wait_until_present
b.text_field(:id => 'entry_0').when_present.set 'your name'
b.button(:value => 'Submit').click
b.button(:value => 'Submit').wait_while_present
Watir::Wait.until { b.text.include? 'Thank you' }
这是我在项目中等待AJAX的方式:
ajax_loader = $b.element(:xpath => "//*[@id='spinner-modal-transparent' and @aria-hidden='true']/div/div/div/div/img[@alt='Ajax transparent loader']")
if ajax_loader.exists?
ajax_loader.wait_while_present(timeout=350)
else
puts "The AJAX loader was not present."
end
browser.wait_until
可以使用。
这很有帮助,因为您可以在参数(()
)中定义要等待的内容,如:
browser.wait_until(browser.text.include("some text"))
您可以使用wait_until
或waituntilExists
方法。
我有同样的问题,我尝试通过组合wait_until_present
和]来解决它>
until browser.div(:id=>"some_div").exists? do sleep 1 end
由@marc构成的技巧:
some_div = browser.div(:id => 'some_div') begin Watir::Wait.until some_div.visible? end rescue Watir::Wait::TimeoutError until some_div.visible? sleep 1 end end
请注意,您有责任确保自己>]
div(:id => "some_div")
确实存在。