selenium-webdriver并等待页面加载

时间:2012-07-07 07:58:05

标签: ruby selenium webdriver

我正在尝试编写简单的测试。我的问题是,我想等到页面完全加载。目前我正在等待一些元素出现,但这不是我想要的。有可能做出这样的事情:

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

使用Java不是问题,但如何用ruby制作呢?

5 个答案:

答案 0 :(得分:13)

这就是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'

答案 1 :(得分:5)

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

driver.manage.timeouts.page_load = 10 # seconds 

答案 2 :(得分:3)

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

因此,在您的情况下,您只需: -

driver.get url

答案 3 :(得分:2)

WebDriver不再需要了。

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

如果你需要等待一些ajax内容,你可以使用imclicit和explicit(按此顺序)等待(在seleniumhq中描述)。

答案 4 :(得分:1)

有些情况下,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++;
        }
    }