2012-07-07 71 views
8

私は簡単なテストを書こうとしています。私の問題は、ページが完全にロードされるまで待つことです。現時点で私はいくつかの要素がプレゼンテーションされるまで待っていますが、それは本当に私が望むものではありません。selenium-webdriverとページが読み込まれるまで待つ

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

Javaで問題はありませんが、どのようにルビーで作っていますか?

答えて

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 

それはそれはルビー/ Railsの上にいくつかのJavascriptを必要とするけれども、あなたがthis SO postからの提案を試みることができるオプションではありません場合。

wait.untilが廃止されているようです。それはあなたが知っている要素を持っているページを探すための新しい提案プロセスが存在します。

expect(page).to have_selector '#main_div_id' 
+0

私はあなたにリンクされ、これが私のために働いたセレンのドキュメントからの例を使用していました。どうもありがとう。 – chucknor

5

私の知る限りwebdriverを理解し、あなたはwebdriverをがblocking APIを持っていますが、可能性があるため、ページのロードを待つ必要がいけませんページロードタイムアウトを設定してください。

driver.manage.timeouts.page_load = 10 # seconds 
2

もうWebDriverでは必要ありません。

WebElement click()およびActions()は、必要に応じて自動的に必要な場合は両方とも「ページ読み込み待ち」をクリックします。

たとえば、ajaxコンテンツを待つ必要がある場合は、代わりにimclicitとexplicit(この順序で)を使用して待機することができます(seleniumhqで説明)。

2

Rubyでは、getを使用してURLを開くたびに、ページが完全に読み込まれたときにのみrubyスクリプトが実行されます。

は、だからあなたの場合にはあなたが単純だろう: -

driver.get url 
+1

私もそうだと思っていましたが、Webdriverのドキュメントでは、「OS /ブラウザの組み合わせなど、堅牢性を確保するために、明示的および暗黙的な待機を使用して要素がページに存在するのを待つ必要があります。 – Umang

+1

私の経験から、Webdriverは、特にAJAXを使用してコンテンツを読み込む際に、すべてがロードされるのを必ずしも待つとは限りません。間違いなく待ってください。 – bsg

+1

ajaxがロードされたデータで、待ち時間が絶対的に必要であることを確認できます。 – Kylee

1

をAJAXやCSSの変更のいずれかが私のテストが時々失敗する原因となった事例がありました。これらのメソッドを静的ドライバインスタンスに追加し、必要に応じてテストが特定の条件を待つようにすることができます。 (c#)

WaitForCssChangeメソッドのTimedWaitは基本的にはThreading.Thread.Sleepです。これは私が推測する最も美しい方法ではありませんが、私のニーズにはうまくいきます。 CSSの変更点については

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")); 
    } 

:Ajaxの待ち時間については

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++; 
     } 
    } 
関連する問題