Selenium WebDriver on Rubyで遊んだり効率化したりしよう! (2)
前回の続きです
これまでの目次
要素が出現するのを待つ
通常でも、手続き的に連続して書いておけばページロードがある程度完了するまでは待ってくれる。 しかし、xhrでの読み込みやスクリプトによるDOMの改変、展開などである要素が出現するのを明示的に待つ必要がある場合もある。
そんなときは Selenium::WebDriver::Wait
を使う
wait = Selenium::WebDriver::Wait.new(:timeout => TIMEOUT)
wait.until do
driver.find_element(....).displayed?
end
wait.until
ブロックでは、評価結果がtrueとみなせるまで一定の周期(設定可能)で、一定の間(上記例だと :timeout
)に渡り実行を繰り返す。
ちょっとひねったパターン
find_elementにcssやxpathを使ったりしている場合に、要素が見つからない場合に例外が出てくるので、上記の例だとうまくいかないこともある。
wait.until do
begin
driver.find_element(...).click
true
rescue
nil
end
end
ポップアップしてくるウインドウ(タブ)を扱う
なにかしらclickすると新しいポップアップ(ウィンドウだったりタブだったり)がある場合がある。
そのまま処理を続けたいが、ドライバのインスタンスはその送信先を1つのwindow(タブ含む)に限定しているため、これを切り替えないといけない。
ポップアップされたウィンドウ(タブ)を識別する
こんな感じで識別できる
main_window = driver.window_handle
driver.find_element(なにかしらポップアップされるやつ).click
wait.until { driver.window_handles.length == 2 }
popup_window = driver.window_handles.detect { |e| e != main_window }
driver.switch_to.window popup_window
重要な要素は以下の通り
driver.window_handle
で、現在のウィンドウ(タブ)のハンドル(IDみたいなもの)を取得できるdriver.window_handles
で、いま開いているウィンドウ(タブ)のハンドル配列を取得できるdriver.switch_to.window
で、指定したウィンドウ(タブ)のハンドルに操作先を切り替えられる
次は
前回と今回で結構カバーできている気もしますが、もう少しトピックがあるかもしれないので含みをもたせつつ今回は終わり。
comments powered by Disqus