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

As far as I understand webdriver, you dont need to wait for page loads because WebDriver has a blocking API but you can sure set a page load timeout.

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コンテンツを待機する必要がある場合は、代わりに(seleniumhqで説明されている)imclicitおよびexplicit(この順序で)waitを使用できます。

于 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 に答える