3

現在、受け入れテストを実行するために、firefox で watir-webdriver (0.6.2) を使用しています。テストの実行には時間がかかり、タイムアウト エラーで失敗することがよくあります。より速く失敗するように、タイムアウト時間を短縮したいと考えました。

私たちは試しました:

browser = Watir::Browser.new("firefox")
browser.driver.manage.timeouts.implicit_wait=3 

ただし、まだ 30 秒のタイムアウトが発生しています。

この問題に関するドキュメントや質問は見つかりませんでした。Watirの待機タイムアウトを適切に構成する方法を知っている人はいますか?

4

3 に答える 3

5

「タイムアウト」の意味によって異なります。私の知る限り、Watir-Webdriver について話すときに一般的に議論されるタイムアウトの 3 つの異なる定義があります。

  1. ブラウザがページの読み込みを待つ時間は?
  2. 「.when_present」関数を介して待機するように指示された場合、要素が「存在しない」または「表示されない」と見なす前に、Watir-Webdriver が明示的に待機する時間
  3. Watir-Webdriverは、要素が「存在しない」または「表示されない」と見なす前に、オブジェクトが表示されるのを暗黙的に待機する時間 (明示的に呼び出して待機していない場合は、#2 を参照)

#1: ページの読み込み

あなたの目標がそれを変更することである場合、説明されているようにページの読み込みタイムアウトを設定できることは Justin Ko が正しいですが、それを行う標準的な方法は、ブラウザーを作成して作成時にブラウザーに渡す前にクライアントのタイムアウトを設定することです。

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 180 # seconds – default is 60

b = Watir::Browser.new :firefox, :http_client => client

- Alistair Scott、「Watir-Webdriver でページ読み込みタイムアウトを変更するにはどうすればよいですか」

#2: 明示的なタイムアウト

しかし、コードを見ずに確実に言うことはできませんが、明示的なタイムアウトが発生しているという@p0dejeの発言は正しいと思います。以下では、暗黙的な宣言をオーバーライドする明示的な宣言を経験しました(意図的なものかどうかはわかりません)。

b = Watir::Browser.new :firefox
b.driver.manage.timeouts.implicit_wait = 3 
puts Time.now #=> 2013-11-14 16:24:12 +0000
begin
  browser.link(:id => 'someIdThatIsNotThere').when_present.click
rescue => e
  puts e #=> timed out after 30 seconds, waiting for {:id=>"someIdThatIsNotThere", :tag_name=>"a"} to become present
end
puts Time.now #=> 2013-11-14 16:24:43 +0000

'when_present' のおかげで、Watir-Webdriver はデフォルトで失敗するまで 30 秒待機します。または、「when_present(10)」と言ってデフォルトを変更し、10 秒待つこともできます。( Watir-Webdriver > Watir::Wait#when_present。)これをグローバルに行う方法を推測することはできません。あなたがそのようなことを見つけない限り、そしてあなたが見つけた場合は私に教えてください-それは電話ごとに行われなければなりません. :(編集仲間の回答者であるジャスティン・コが、私が上記で説明したことを行う方法について回答をくれました編集2:リンクされた回答の@justinkoごとに、@jaribがこれをWatirに追加しました:「更新:このモンキーパッチはそのため、watir-webdriver v0.6.5 では不要になります。次を使用してタイムアウトを設定できます: Watir.default_timeout = 90"

#3 暗黙のタイムアウト

あなたが提供したコードは、あなたが明示的に言わなくても、Watir-Webdriver が任意の要素が存在するのを待つ時間を設定します:

b = Watir::Browser.new :firefox
b.driver.manage.timeouts.implicit_wait = 3 
puts Time.now #=> 2013-11-14 16:28:33 +0000
begin
  browser.link(:id => 'someIdThatIsNotThere').when_present.click
rescue => e
  puts e #=> unable to locate element, using {:id=>"someIdThatIsNotThere", :tag_name=>"a"}
end
puts Time.now #=> 2013-11-14 16:28:39 +0000
于 2013-11-14T16:35:21.110 に答える
1

更新Watir 6.5以降、デフォルトのタイムアウトは次を使用して構成できます

Watir.default_timeout = 3

同じ問題が発生し、タイムアウトを含む Watir メソッドをオーバーライドすることを選択しました。

  • Watir::Wait.until { ... }
  • Watir::Wait.while { ... }
  • object.when_present.set
  • object.wait_until_present
  • object.wait_while_present

spec_helper.rbここにコードがあります。rspec

# method wrapping technique adapted from https://stackoverflow.com/a/4471202/177665
def override_timeout(method_name, new_timeout = 3)
  if singleton_methods.include?(method_name)
    old_method = singleton_class.instance_method(method_name)

    define_singleton_method(method_name) do |timeout = new_timeout, *args, &block|
      old_method.bind(self).(timeout, *args, &block)
    end
  else
    old_method = instance_method(method_name)

    define_method(method_name) do |timeout = new_timeout, *args, &block|
      old_method.bind(self).(timeout, *args, &block)
    end
  end
end

# override default Watir timeout from 30 seconds to 3 seconds
module Watir
  module Wait
    override_timeout(:until)
    override_timeout(:while)
  end

  module EventuallyPresent
    override_timeout(:when_present, 5) # 5 secs here
    override_timeout(:wait_until_present)
    override_timeout(:wait_while_present)
  end
end

https://stackoverflow.com/a/44712​​02/177665からの回答を使用して機能させました。

于 2013-11-18T11:11:42.423 に答える