2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SeleniumによるWebスクレイピングで活躍するexecute_scriptメソッド

Last updated at Posted at 2020-10-08

はじめに

SeleniumでWebスクレイピングを行う際に活躍してくれるexecute_scriptメソッドについてまとめます。execute_scriptはJavaScriptで記述した動作をWebページに対して実行してくれるものです。

目次

  1. execute_scriptを使わない場合はfind_element
  2. execute_script
  3. メソッドにして、より使いやすく
  4. まとめ

#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スクレイピングが捗ると思います。是非活用してみてください。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?