2012-03-26 13 views
8

私はwatir-webdriver ruby​​ gemを使用しています。ブラウザ(Chrome)を起動し、ページの読み込みを開始します。ページの読み込みが遅すぎ、watir-webdriverがタイムアウトエラーを起こします。ブラウザのページの読み込みを停止するにはどうすればよいですか?ヘッドレスブラウザの読み込みを停止するページ

require 'watir-webdriver' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 10 
@browser = Watir::Browser.new :chrome, :http_client => client 

sites = [ 
    "http://google.com/", 
    "http://yahoo.com/", 
    "http://www.nst.com.my/", # => This is the SLOW site 
    "http://drupal.org/", 
    "http://www.msn.com/", 
    "http://stackoverflow.com/" 
] 

sites.each do |url| 

    begin 
    @browser.goto(url) 
    puts "Success #{url}" 
    rescue 
    puts "Timeout #{url}" 
    end 

end 

########## Execution result ########## 

# Success http://google.com/ 
# Success http://yahoo.com/ 
# Timeout http://www.nst.com.my/ 
# Timeout http://drupal.org/ 
# Timeout http://www.msn.com/ 
# Timeout http://stackoverflow.com/ 

########## Expected result ########## 

# Success http://google.com/ 
# Success http://yahoo.com/ 
# Timeout http://www.nst.com.my/ 
# Success http://drupal.org/ 
# Success http://www.msn.com/ 
# Success http://stackoverflow.com/ 

ページの読み込みが完了する前にブラウザが他のコマンドに応答しないようです。ブラウザがロード中のページを捨てて、次のコマンドを実行させるにはどうすればよいですか?

を更新し

私は多分それはこの問題を解決するのに役立ちます興味深い機能フラグloadAsync http://src.chromium.org/svn/trunk/src/chrome/test/webdriver/webdriver_capabilities_parser.ccを発見しましたか?私はクロムドライバを起動するときにこれを設定するためのワイア(webdriver)を作る方法はまだ分かりません。あなたは多くのサイトを持っている

require 'watir-webdriver' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 60 
@browser = Watir::Browser.new :firefox, :http_client => client 

begin 
    @browser.goto mySite 
rescue => e 
    puts "Browser timed out: #{e}" 
end 

next_command 

場合は、しようとしている:このフラグは、ここでhttp://codereview.chromium.org/7582005/

+0

私の頭の上には、このことの説明が1つしかありません。 Watirはシングルスレッドです。 –

+0

私は複数のスレッドでそれを使用しようとしていません。私はちょうど1つのコマンドとそのタイムアウトが次のコマンドを実行することは不可能な後になぜ思う。 – Molfar

+0

私はシングルスレッドと言っていますが、webdriverにメッセージを送信して同期呼び出しを行い、webdriverからの応答を得るまで何もできないことを意味します。したがって、非同期呼び出しを同期呼び出しに変更するまで、このシナリオで実行したいことは実行できません。 –

答えて

4

あり、あなたが希望しているものを行うにはいくつかの異なる方法がありますが、ここで私はどうなるのかだ導入されましたタイムアウトの確認のためにロードするには、配列に入れてください:

mySites = [ 
      mySite1, 
      mySite2, 
      mySite3 
] 

mySites.each do |site| 
    begin 
     @browser.goto site 
    rescue 
     "Puts #{site} failed to load within the time allotted." 
    end 
end 

UPDATE for concept of concept。このスクリプトは常にステップ2に進みます。レスキューは第2のgotoには必要ではなく、より明確な出力に使用されています。あなたのスクリプトはこれとどのように違うのですか?

require 'watir-webdriver' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 1  #VERY low timeout to make most sites fail 
@browser = Watir::Browser.new :firefox, :http_client => client 


def testing 
    begin 
    @browser.goto "http://www.cnn.com" 
    rescue => e 
    puts "Browser timed out on the first example" 
    end 

    begin 
    @browser.goto "http://www.foxnews.com" 
    rescue => e 
    puts "Browser timed out on the second example" 
    end 
end 
+0

問題は、次のような "next_command"(@ browser.goto "http://another-site.com"や@ browser.closeのような)が別のタイムアウトエラーを引き起こすことです。タイムアウトを初めて発生させた後、ブラウザが "フリーズ"しているようです。 – Molfar

+0

@Molfar私はこれを数回試しましたが、エラーを再現することができません。私が試していることを示すためのコード例を追加しました。これは期待通りに動作します。 –

+0

ここに私のテストコードhttp://pastebin.com/vNiKZ9tPが記載されている動作を確認します。なぜスクリプトが2番目のレスキューブロックに到達したのだろうか。それはあなたのコードとは異なり、最初のサイトだけがタイムアウトに達する必要があります。 – Molfar

2

Googleを停止してAutoITを使用してページを読み込むと、エスケープキーを送信できます。これはもともとやってみたのと似ていますが、壊れたWatir :: Browserオブジェクトではなく、AutoITを直接使用しています。

require 'watir-webdriver' 
require 'win32ole' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 5 
@browser = Watir::Browser.new :chrome, :http_client => client 
begin 
    @browser.goto "http://www.nst.com.my/" 
rescue 
    autoit = WIN32OLE.new("AutoItX3.Control") 
    autoit.AutoItSetOption("WinTitleMatchMode", 2) 
    autoit.WinActivate("Google") 
    autoit.Send("{ESC}") 
end 
@browser.goto "http://www.google.ca" 

注:私はそれがアクティブウィンドウであることをブラウザが必要ないように仕事にautoit.ControlSend("Google", "", "", "{ESC}")を取得しようとしました。何らかの理由で、それ自体で動作していましたが、上記のスクリプトでは動作しませんでした(つまり、キーは送信されましたが、ブラウザは期待どおりに反応しませんでした)。

+1

すべては、ヘッドレスモード(プロダクション)のLinuxマシンで行われています。 – Molfar

0

私はこの問題をしばらく取り組んできましたが、私はこの投稿が2012年以降であることを知っていますが、まだこの問題を解決するものは見つかりませんでした。

require 'watir-webdriver' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 5 
@browser = Watir::Browser.new :firefox, :http_client => client 

@browser.goto "twitter.com" 

#after the page loads, log in 
def test  
    begin 
    temp = [] 
    temp = @browser.cookies.to_a 
    @browser.goto "twitter.com:81" 
    rescue => e 
    puts "Browser timed out" 
    @browser.close 
    @browser = Watir::Browser.start "twitter.com" 

    temp.each do |me| 
     @browser.cookies.add(me[:name], me[:value]) 
    end 
    @browser.refresh 

    end 
end 

クッキーを保存して復元する特別なコードは、使用しているサイトにログインしたままにすることができます。これは私の周りの唯一の仕事を考えることができますが、吸う。もう一度これは2012年に戻ったので、誰かがうまくいくものを見つけたら、私を修正してください。

+0

@ browser.closeが機能しないため、問題は解決しません。 – Molfar

+0

私のコンピュータ上にあります。私はLinux debian 3.2.0-4-amd64#1を使用しています。SMP Debian 3.2.57-3 + deb7u1 x86_64 GNU/Linux、Firefox 17.0.10、watir 5、watir-webdriver 0.6.4 – Duck1337

+0

ruby​​ 1.9。3p484(2013-11-22リビジョン43786)[x86_64-linux] – Duck1337

0

タイムアウトの問題もありました。オンラインリサーチからの私の理解は、Selenium WebDriverがタイムアウトになった後、それは悪い形状と誤動作(マルチスレッド問題)になります。私はここで見つけるアドバイスに従いました:私はすべての例外の救助後にアクティブ(代わりにbrowser.closeの)殺害とWatir::Browserの再起動を実施し

https://github.com/watir/watir-webdriver/issues/137

関連する問題