• 等待
  • Ruby selenium part3 等待

    等待

    <!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
    

    上一篇:Ruby selenium part2 加载策略及代理

    下一篇:Ruby selenium part4 窗口