seleniumとは
seleniumとはWEBを操作するオートメーションツールでWEBのUIテストを行うために使用されるツールです。
元々はWEBにJavaScriptのコードを流しWEBを操作する仕組みでしたが、セキュリティの制限に引っかかる事が多かったため、現在はWebDriverを操作してブラウザを操作するプログラムになっています。
今回はwindows環境でChromeを操作する方法を解説します。
Mac等とはディレクトリの指定方法が異なるだけですので、同じコードで問題なくseleniumが扱えます。
seleniumの環境設定
まずはseleniumを扱う環境の構築が必要です。
恐らく初学者が初めてseleniumを扱うと様々なエラーが発生するかと思われますが、なるべく発生しやすいエラーを解決する方法も記述していきたいと思います。
seleniumをインストールしよう
まずはpipを使用してseleniumをインストールさせます。
pip install selenium
ChromeDriverをダウンロードしよう
公式サイトよりChromeDriverをダウンロードしましょう。
様々なバージョンのChromeDriverがありますけど、基本的には最新版のChromeDriverをダウンロードしておけば問題ないです。
Mac用やwindows版等がありますが、お使いのOSのドライバーをダウンロードしてください。
ChromeDriverを収納するファイルを作成しよう
ダウンロードしたファイルの中にChromeDriver(.exe)がありますがこれを保存するファイルを作成します。
基本的にどこに作成しても問題ありませんが、ディレクトリの指定を行わなければなりません。
今回はデスクトップにファイルを作成しましょう。
名前は何でもいいですが今回はseleniumという名前のファイルにChromeDriver(.exe)を収納しておきます。
クロームをseleniumで開いてみよう
それではseleniumを使ってブラウザを開いてみます。
from selenium import webdriver d = webdriver.Chrome('ディレクトリを指定します') d.get('https://www.google.com/')
ここまででうまくいくとクロームが起動するはずです。
エラーが発生する原因と解決方法
発生する主なエラーと解決方法はコチラです
このようなエラーが発生した場合はディレクトリの指定方法がうまくできていません。
シンタックスエラーとは構文エラーの事です。
特にWindowsでディレクトリを指定する際は「\」を使いますが、バックスラッシュはpythonの構文ではバックスラッシュはエスケープシーケンスとして扱われるので、ディレクトリを指定する場合はrow stringを使用しなければなりません。
文字リテラルの前にrかRを付けるとバックスラッシュが全て文字列に入ります。
例えば、このようにディレクトリを指定してあげます。
d = webdriver.Chrome(r'C:\Users\user\Desktop\selenium\chromedriver')
これでシンタックスエラーは回避できたかと思われます。
次に多いエラーとしてはクロームのバージョンとChromeDriverのバージョンが異なる場合です。
この場合まずはクロームのバージョンを調べてあげましょう。
メニュー>ヘルプ>Chromeについてより、クロームの更新及び、現在のバージョンが確認できます。ChromeDriverとバージョンが一致していないとエラーが発生しますので合わせるようにしましょう。
AttributeErrorが発生した場合は別記事で解説していますのでそちらを参考にしてください。
AttributeErrorとは AttributeErrorとは属性が間違っている事を知らせてくれているエラーです。 Attribute=属性という意味です。 pythonでselenium等を使用していると、 AttributeEr[…]
seleniumで要素を指定する方法
実際にseleniumでWEBを動かすためには要素を指定しないといけません
例えば「はい」「いいえ」の2択があったとして「はい」を選択するにはどのように指定できるのでしょうか。
答えはIDやクラス名で指定してあげるのです。
それでは指定方法を見てみましょう。
メソッドの書き方はこの通りです。実際のコードはこのようになります。
変数名はdとしています。
d.find_element_by_id('ID') d.find_element_by_class_name('CLASS_NAME') d.find_element_by_name('NAME') d.find_elements_by_css_selector('CSSセレクタ') d.find_elements_by_xpath('XPath')
指定の書き方は上記の通りです。この中でもIDで指定できるのもはなるべくIDで指定しましょう。IDはHTML内で重複できないので余計なものまで指定する事がないです。
2ページや3ページ等複数のページ数がある記事の場合、リンクテキストで指定する事もできます。
d.find_elements_by_link_text('2ページ目へ進む') d.find_elements_by_partial_link_text('2ページ')
上のコードはリンクテキストが完全に一致している場合指定する事ができるコードです。
対して下のコードはリンクテキストが一部分一致していると指定する事ができるコードです。
要素の指定方法は以上です。次は要素を指定して実際にブラウザを操作してみましょう。
seleniumで要素を操作しよう
seleniumで要素を操作する方法は大きく分けて二つあります。
一つは要素を指定してメソッドで操作する。
もう一つはJavaScriptで動かくの2パターンです。
今回はメソッドで操作する方法を解説していきます。
今回はyahooのページを実際に操作するコードを用いて解説します。
※ID名等は変更される場合がありますので、このコードで確実に実行される保証はありません。
クリックする
yahooのTOPページの左上にあるトラベルをクリックしてyahooトラベルへ遷移してみよう。
※サーバーに負荷をかけないようにTimeモジュールを使用して、5秒スリープするコードも記述しています。
import time from selenium import webdriver d = webdriver.Chrome(r'C:\Users\user\Desktop\selenium\chromedriver') d.get('https://www.yahoo.co.jp/') time.sleep(5) d.find_element_by_css_selector('#mhi1st > a:nth-child(1)').click()
このコードを実行すると、yahooのTOPページからyahooトラベルに遷移できます。
この行のコードでfindメソッドでCSSセレクターを指定して、clickメソッドで要素をクリックしています。
テキストの入力とクリア方法
要素の指定.send_keys()
テキストのクリア
要素の指定.clear()
検索窓からテキストを入力して検索する方法や再度検索を行う時の為にテキストをクリアする方法を解説します。
ではまたまた、yahooを使って解説します。
検索窓にyahooと入力して、クリアして、googleと入力してクリックする一連の動作のコードを書いてみます。
import time from selenium import webdriver d = webdriver.Chrome(r'C:\Users\user\Desktop\selenium\chromedriver') d.get('https://www.yahoo.co.jp/') time.sleep(2) d.find_element_by_id('srchtxt').send_keys('yahoo') time.sleep(2) d.find_element_by_id('srchtxt').clear() time.sleep(2) d.find_element_by_id('srchtxt').send_keys('google') time.sleep(2) d.find_element_by_id('srchbtn').click()
sendメソッドでyahooが入力されてclearメソッドでクリアした後にsendメソッドでgoogleと入力された後clickメソッドでgoogleに遷移できます。
select要素の操作
select要素を操作するにはselectモジュールが必要です。
from selenium.webdriver.support.ui import Select
selectタグを操作する方法は3パターンあります。
Select(要素の指定).select_by_index(‘index番号’)
Select(要素の指定).select_by_visible_text(‘テキスト’)
Select(要素の指定).deselect_by_index(‘index番号’)
Select(要素の指定).deselect_by_visible_text(‘テキスト’)
Select(要素の指定).deselect_all()
選択の解除は選択の解除が行える要素のみに操作が行えます。
例えば、予めvalueがセットされているselectタブ等は解除が行えません。
それでは今回はウラコレいう占いサイトで生年月日を自動的に入力してみるコードを見てみましょう。上から順にvalue指定、インデックス指定、テキスト指定を行っています。
import time from selenium import webdriver from selenium.webdriver.support.ui import Select d = webdriver.Chrome(r'C:\Users\user\Desktop\selenium\chromedriver') d.get('https://cocoloni.me/free/180419_abo/') time.sleep(2) Select(d.find_element_by_id('birth_self_year')).select_by_value('1992') time.sleep(2) Select(d.find_element_by_id('birth_self_month')).select_by_index(9) time.sleep(2) Select(d.find_element_by_id('birth_self_day')).select_by_visible_text('29') time.sleep(2)
これでselectを操作して生年月日が入力できます。
ページの操作
要素を指定せずにページ全体を操作する方法を解説します。
当サイトではdriverを収納している変数は「r」となっていますので、ご注意ください。
画面を最大化する
d.maximize_window()
ページを戻る
d.back()
ページを進める
d.forward()
ページを更新する
d.refresh()
ページを閉じる
d.close()
全てのページを閉じる
d.quit()
アラートを操作したい時
Alert(d).accept()
pythonでseleniumを操作するまとめ
以上が基本的なpythonでのselenium操作方法です。
上記の項目を組み合わせるだけで、WEBの動作は一通り行えるかと思われます。
後はcsvやexcelから情報を取ってきてブログを自動で投稿したり、SEO調査の一環として、特定のキーワードのTOP10のサイトのタイトルやh1タグを毎日自動的に取得したりと様々な動作をseleniumで行えるようになります。
次回はseleniumを使用して、スクレイピングを行う方法を解説します。