ちょっとマニアックなことをしたのか、あまりドンピシャな記事を見つけられなかったのでメモしておく。
やろうとしたのは
- switchToWindowで遷移するときにウィンドウが開くのを待つこと(あんまり意味ないような気もしてきたが)
(基本)待つには
- inplicity Wait (暗黙) / Explicit Wait(明示) がある。
- 今回は、Explicit Wait.
waitのサンプルを参考にためしてみる
https://qiita.com/t_y_cafe/items/5e1645e9221d3b1d0a4e より
$wait = Selenium::WebDriver::Wait.new(:timeout => 60)
$wait.until{driver.find_element(:id,'OK_btn').displayed?}
- ElementじゃなくてWindowだけど同じ方法でできるのか? -> できなかった
- wait.until{driver.switch_to_window}でリトライしてくれない(NoSuchWindowErrorが出てしまう、、、)
解決方法
- irbでステップ実行していたときのログがヒントとなった。
- waitメソッドにignored=[NoSuchElementError]が入っていて、見つからなかった場合にリトライ、みたいになってそう。
irb(main):080:0> wait = Selenium::WebDriver::Wait.new(:timeout => 1, :interval => 0.1)
wait.until {driver.switch_to.window(“new")}=> #<Selenium::WebDriver::Wait:0x00007f8041118258 @timeout=1, @interval=0.1, @message=nil, @ignored=[Selenium::WebDriver::Error::NoSuchElementError]>
- APIドキュメントによると、:ignoreとして無視するErrorを設定できるらしい。
- NoSuchWindowErrorを追加することで、ウィンドウが見つからなかったらリトライ、にする。
$wait = Selenium::WebDriver::Wait.new(:timeout => 60, :ignore => [Selenium::WebDriver::Error::NoSuchWindowError])
$wait.until{driver.switch_to.window(”new”).nil?}
- 要素がみつからず時間だけがすぎた時には、Selenium::WebDriver::Error::TimeoutErrorが出るので囲ってキャッチしておくのを忘れない
- なるほど便利。