【问题标题】:selenium-webdriver and wait for page to loadselenium-webdriver 并等待页面加载
【发布时间】:2012-07-07 13:41:38
【问题描述】:

我正在尝试编写简单的测试。我的问题是,我想等到页面完全加载。目前我正在等到一些元素出现,但这并不是我真正想要的。是否可以制作这样的东西:

driver = Selenium::WebDriver.for :chrome
driver.navigate.to url
driver.wait_for_page_to_load "30000"

用Java没问题,但是用ruby怎么做呢?

【问题讨论】:

    标签: ruby selenium webdriver


    【解决方案1】:

    Selenium docs() 是这样建议的:

    require 'rubygems'
    require 'selenium-webdriver'
    
    driver = Selenium::WebDriver.for :firefox
    driver.get "http://google.com"
    
    element = driver.find_element :name => "q"
    element.send_keys "Cheese!"
    element.submit
    
    puts "Page title is #{driver.title}"
    
    wait = Selenium::WebDriver::Wait.new(:timeout => 10)
    wait.until { driver.title.downcase.start_with? "cheese!" }
    
    puts "Page title is #{driver.title}"
    driver.quit
    

    如果这不是一个选项,您可以尝试this SO post 的建议,尽管它需要在 Ruby/Rails 之上使用一些 Javascript。

    wait.until 似乎正在/已经被淘汰。新建议的过程是寻找页面以包含您知道的元素:

    expect(page).to have_selector '#main_div_id'
    

    【讨论】:

    • 我使用了您链接到的 Selenium 文档中的示例,这对我有用。非常感谢。
    【解决方案2】:

    据我了解 webdriver,您不需要等待页面加载,因为 WebDriver 有一个blocking API,但您可以确定设置页面加载超时。

    driver.manage.timeouts.page_load = 10 # seconds 
    

    【讨论】:

      【解决方案3】:

      因此,在 Ruby 中,每当您使用 get 打开 URL 时,ruby 脚本仅在页面完全加载时才会继续。

      因此,在您的情况下,您只需执行以下操作:-

      driver.get url
      

      【讨论】:

      • 我也这么认为,但是 Webdriver 文档指出 - “取决于几个因素,包括操作系统/浏览器组合,WebDriver 可能会或可能不会等待页面加载。在某些情况下,WebDriver 可能会返回在页面完成甚至开始加载之前进行控制。为确保稳健性,您需要使用显式和隐式等待来等待页面中存在的元素。"
      • 根据我的经验,Webdriver 绝对不会总是等待加载所有内容,尤其是在使用 AJAX 加载内容时。一定要等待。
      • 我可以用 ajax 加载的数据确认绝对需要等待。
      【解决方案4】:

      WebDriver 不再需要这些了。

      如果需要,WebElement click() 和 Actions click() 都会自动“等待页面加载”。

      如果您需要等待一些 ajax 内容,例如,您可以使用不隐含和显式(按此顺序)等待(在 seleniumhq 中描述)。

      【讨论】:

        【解决方案5】:

        在某些情况下,AJAX 或 CSS 更改有时会导致我的测试失败。我将这些方法添加到我的静态驱动程序实例中,以便我可以让测试在需要时等待某些条件。 (c#)

        WaitForCssChange 方法中的 TimedWait 基本上只是一个 Threading.Thread.Sleep 这不是我猜的最漂亮的方式,但它很适合我的需要。

        对于 Ajax 等待:

         public static void WaitForAjax()
            {
                var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(25));
                wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
            }
        

        对于 CSS 更改:

        public static void  WaitForCssChange(IWebElement element, string value)
            {
                int counter = 0;
                while (true)
                {
                   if(element.GetAttribute("style").Contains(value) || counter > 50)
                   {
                       break;
                   }
                   TimedWait(20);
                   counter++;
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-31
          • 1970-01-01
          • 1970-01-01
          • 2012-07-12
          • 2012-05-30
          • 2014-09-26
          • 2013-09-09
          • 2018-03-20
          相关资源
          最近更新 更多