等待
<!doctype html>
<meta charset=utf-8>
<title>Race Condition Example</title>
<script>
var initialised = false;
window.addEventListener("load", function() {
var newElement = document.createElement("p");
newElement.textContent = "Hello from JavaScript!";
document.body.appendChild(newElement);
initialised = true;
});
</script>
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
begin
# Navigate to URL
driver.get 'file:///race_condition.html'
# Get and store Paragraph Text
search_form = driver.find_element(:css,'p').text
"Hello from JavaScript!".eql? search_form
ensure
driver.quit
end
显式等待
显式等待的超时时间会在没有返回True时一直尝试和等待
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
def document_initialised(driver)
driver.execute_script('return initialised')
end
begin
driver.get 'file:///race_condition.html'
wait.until{document_initialised driver}
search_form = driver.find_element(:css,'p').text
"Hello from JavaScript!".eql? search_form
ensure
driver.quit
end
在超时时间内一直等待
driver.get 'file:///race_condition.html'
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
ele = wait.until { driver.find_element(css: 'p')}
foo = ele.text
assert_match foo, 'Hello from JavaScript'
用displayed来覆盖超时
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { driver.find_element(:id, 'message').displayed? }
隐式等待
隐式等待会在一定时间内轮询DOM
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10
begin
driver.get 'http://somedomain/url_that_delays_loading'
search_form = driver.find_element(:id,'dynamic_element')
ensure
driver.quit
end
流畅等待
这种情况会忽略特定类型的异常,如下即使没找到元素,也会忽略掉,而不会因异常报错。
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
exception = Selenium::WebDriver::Error::NoSuchElementError
begin
driver.get 'http://somedomain/url_that_delays_loading'
wait = Selenium::WebDriver::Wait.new(timeout: 30, interval: 5, message: 'Timed out after 30 sec', ignore: exception)
foo = wait.until { driver.find_element(id: 'foo')}
ensure
driver.quit
end