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