8

私はwatir-webdriverrubygemを使用しています。ブラウザ(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/

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

更新しました

興味深い機能フラグloadAsynchttp://src.chromium.org/svn/trunk/src/chrome/test/webdriver/webdriver_capabilities_parser.ccを見つけましたこの問題を解決するのに役立つかもしれません。chromedriverを起動するときにこれを設定するためのwatir(webdriver)の作り方がまだわかりません。このフラグはここで導入されましたhttp://codereview.chromium.org/7582005/

4

4 に答える 4

4

あなたが望んでいることを行うにはいくつかの異なる方法がありますが、これが私がすることです:

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

タイムアウトの確認のためにロードしようとしているサイトがたくさんある場合は、それらを配列に入れます。

mySites = [
          mySite1,
          mySite2,
          mySite3
]

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

概念実証のための更新。このスクリプトは常にステップ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
于 2012-03-26T17:27:00.863 に答える
2

AutoIT を使用して Escape キーを送信することで、Google によるページの読み込みを停止できます。これは、最初にやろうとしたことと似ていますが、壊れた 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}")注:ブラウザをアクティブなウィンドウにする必要がないように、作業を開始しようとしました。単独で実行すると機能しましたが、何らかの理由で上記のスクリプトで機能させることができませんでした (つまり、キーが送信されましたが、ブラウザーが期待どおりに反応しませんでした)。

于 2012-03-27T15:55:06.890 に答える
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

Cookie を保存および復元する追加のコードにより、使用しているサイトにログインしたままにすることができます。これはひどいですが、私が考えることができる唯一の回避策です。繰り返しますが、これは 2012 年にさかのぼります。

于 2014-07-14T17:08:25.077 に答える
0

タイムアウトの問題もありました。オンライン調査からの私の理解では、Selenium WebDriver がタイムアウトに遭遇した後、それは悪い形になり、誤動作します (マルチスレッドの問題)。私はここにあるアドバイスに従いました:

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

(browser.close の代わりに) アクティブな強制終了とWatir::Browser例外レスキュー後の再起動を実装しました。

于 2015-02-04T16:26:04.663 に答える