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のところに移動してからクリックするなど工夫する必要があります。
補足
過去記事もよろしければ参考にして頂ければ幸いです