8

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

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

用 Java 没问题,但是如何用 ruby​​ 来做呢?

4

5 回答 5

15

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

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

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

expect(page).to have_selector '#main_div_id'
于 2012-07-07T09:28:31.427 回答
5

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

driver.manage.timeouts.page_load = 10 # seconds 
于 2012-07-07T18:54:20.927 回答
3

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

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

driver.get url
于 2012-07-07T23:32:11.983 回答
2

WebDriver 不再需要这些了。

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

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

于 2012-07-07T22:19:05.813 回答
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++;
        }
    }
于 2015-02-25T16:12:37.057 回答