SeleniumのActionBuilderを使ってみました

実践 Selenium WebDriverを読んで以来、使ってみようと思いつつ使っていなかったActionBuilderを先日使ったので、メモとして残します

リファレンス

Class: Selenium::WebDriver::ActionBuilder

環境

Rubyです

背景

あるページを開いて、そこにあるアンカーリンクを一通り順番に叩いて、リンク切れしていないか

を確認したい、ということがありました。結構リンク数があったので、Selenium使いたいなという感じです。

ちょっと話は逸れますが、リンク切れしていないかの確認でHTTP STATUSの200 OKを確認しようかと思ったのですが、どうやらSeleniumだとHTTP STATUSが取得出来ないようで、HTTP STATUSを確認する良い方法を模索中です。ちなみに、今回は、諸事情あって、かなり力技で、全部の画面キャプチャを撮りましたww。普通であれば、タイトルとかh1とかで値をチェックすれば大丈夫かなと思います。

話を戻しますと、アンカーリンクを一通り叩くというので、find_elementsを使って、aタグをごそっと取ってきて、ループさせようかと思ったのですが、1回叩くとページ遷移してしまうので、ループがうまくいきませんでした(ページ遷移したタイミングで、Elementがいなくなってしまうので)

なので、アンカーは別ウィンドウで開いて確認しようという考えになり、SHIFT押しながらクリックしたいなで、ActionBuilder使おうとなりました

使い方

正直、リファレンスそのまま使えば大丈夫なのですが、流れとしては、以下のようになります(今回の場合)

  • Elementを見つける
element = driver.find_element(:id,'hogehoge')

# ちなみに、「アンカータグ全部拾う」は
elements = driver.find_elements(:tag_name,'a') # => 配列が返ってきます
  • Actionの流れを作って、実行する
driver.action.key_down(:shift).click(element).key_up(:shift).perform

ポイントは、最後のperformですかね。それまでは、ひたすらActionを作っていくイメージで、最後にperformすると作ったActionを実行してくれます。

ちなみに、key_down(:shift)の後にkey_up(:shift)しないと、私の環境ではちょっと変な動きをしていましたので、しておいて方がおそらく良いかと思います。

あと、ページが大きかったりすると、Elementがウィンドウの中に見えていなくて、クリック出来ないということもありました。そういうときには、Actionの中にmove_toメソッドを入れて、そのElementのところに移動してからクリックするなど工夫する必要があります。

補足

過去記事もよろしければ参考にして頂ければ幸いです

genius.hateblo.jp

genius.hateblo.jp

genius.hateblo.jp