はじめに
SeleniumでWebスクレイピングを行う際に活躍してくれるexecute_scriptメソッドについてまとめます。execute_scriptはJavaScriptで記述した動作をWebページに対して実行してくれるものです。
目次
- execute_scriptを使わない場合はfind_element
- execute_script
- メソッドにして、より使いやすく
- まとめ
#1. execute_scriptを使わない場合はfind_element、find_elements
SeleniumでWebスクレイピングを行う場合、通常はfind_element、find_elementsメソッドで要素を指定し、clickメソッドなどを実行することで、ページ処理を行います。
#####find_element、find_elementsを使った場合
# クリック動作(例:submit_btnというクラス、"送信"というvalueを持つinput要素)
@driver.find_element(:class,'submit_btn').click # クラスで指定
@driver.find_element(:css,"input[value='送信']").click # CSSで指定
# 値の入力
@driver.find_element(:name,'favorite_food').send_keys('ramen')
# 要素の数を調べる
@driver.find_elements(:class, '.btn').size # ボタンの数を確認。
#2. execute_script
上のfind_element(s)であると、正確に要素を指定できているかを確認するのに毎回rubyを実行しなければならないため、少々面倒くさいです。そこで、以下のようにexecute_scriptで同じ動作を実装してみます。
#####execute_scriptを使った場合
# クリック動作
@driver.execute_script(%{document.querySelector('.submit_btn').click();}) # クラスで指定
@driver.execute_script(%{document.querySelector("input[value='送信']").click();}) # CSSで指定
# 値の入力
@driver.execute_script(%{document.querySelector("[name='favorite_food']").value = 'ramen';})
# 要素の数を調べる
@driver.execute_script(%{return document.querySelectorAll('.btn').length;}) # ボタンの数を確認
execute_scriptの引数に直接実行したいJavaScriptコードを書きます。こうすることで、WebブラウザでJavascriptを実行しながら、開発を行うことができます。chromeの場合は、デベロッパーツールのConsoleタブにJavaScriptを打ち込むだけで、実行を行うことができます。これにより、エディタやターミナルを往復する回数が激減し、効率的な開発が可能となります。
#3. メソッドにして、より使いやすく
また、冗長性の削減や読みやすさを考えて、メソッド分割でリファクタリングするのが望ましいです。この場合、cssセレクタや送りたい値などを引数に渡してあげるようにします。
JavaScriptによる処理をメソッド定義した場合
# クリック動作のメソッド
def query_click(css_selector)
@driver.execute_script(%{document.querySelector("#{css_selector}").click();})
end
# 値の入力をするメソッド
def value_input(css_selector,value)
@driver.execute_script(%{document.querySelector("#{css_selector}").value = "#{value}";})
end
# 要素の数を調べるメソッド
def query_count(css_selector)
@driver.execute_script(%{return document.querySelectorAll("#{css_selector}").length;})
end
query_click('.submit_btn') # クラスで指定してクリック
query_click("input[value='送信']") # cssで指定してクリック
value_input("[name='favorite-food']",'ramen') # 値の入力
query_count('.btn') # ボタンの数を調べる
#4. まとめ
execute_scriptによってSeleniumにJavaScriptを実行させるやり方をまとめました。JavaScriptはページをまたいでの処理ができないため、ページ遷移させて繰り返し処理を実行したい場合などにはfind_elementを使用したほうがいいかもしれません。どちらも使えるようになっておくと、Webスクレイピングが捗ると思います。是非活用してみてください。