0

以下のように、または時々使用sleep(10)します。

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
element = wait.until { driver.find_element :name => "search" }
element = driver.find_element :name => "search"

私によるとwait、最大タイムアウトを設定しました。その間に要素が見つかった場合 ( <10 seconds)、次の行に移動するか、再び見つからない場合も次の行に移動しますが、前に設定したように 10 秒後に移動します。

しかし、その期間内に目的の要素がロードされたかどうかsleep()をプログラムが待たなければならないのを待つ必要があります。10 seconds

どちらもelement not found基本的にエラーを防ぐために一般的に使用されます。

今私の質問は -

  • と の間にこれ以上の違いはwaitありsleepますか?

  • エラーの可能性を減らすためのより良い設計はどれですか?

  • element not foundプログラムを失敗させることなく、このようなエラーを効率的に処理できるような状況を処理するためのより良い実装はありますか?

編集

最後の質問では、以下のような最小限のリスク コードが 1 つ見つかりました。

while true

 # do nothing

next if !(driver.title.include? "Buyer Home")

 driver.find_element(:link, "search").click
 break

end
4

1 に答える 1

1

wait.untilsleep次の行に移動するという点では同じではありません。wait.until指定された時間枠内にブロック (要素の検索など) が見つからない場合、例外がスローされます。

2 つの方法で、エラーを減らす可能性は同じです。スリープまたはタイムアウトが 30 秒に設定されていて、要素をロードするのにページが 35 秒かかる場合、両方でエラーが発生します (ただし、行は異なります)。要点wait.untilは、ページの読み込みに 5 秒しかかからない場合、常に 30 秒待つ必要がないということです。

よりもどの実装が優れているかはわかりませんwait.until。要素が見つからない場合、プログラムは失敗します。既存のフィールドに依存する何かが実行されるまで待つよりも、すぐに失敗する方が理にかなっています。

アップデート

コメントに従って、私は書き直します

while true
  # do nothing
  next if !(driver.title.include? "Buyer Home")

  driver.find_element(:link, "search").click
  break
end

なので

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
wait.until { driver.title.include? "Buyer Home" }
driver.find_element(:link, "search").click
于 2013-03-15T14:21:38.123 に答える