Seleniumは、ChromeやEdgeなどのブラウザを自動的に操作するライブラリです。
利用用途として、WebサイトやWebアプリケーションの単体テスト、Webスクレイピングによるデータ収集に使われます。
また、Seleniumライブラリで制御するのがWebdriverになります。
本記事では、SeleniumにおけるWebdriverの使い方を解説します。
- SIer/Web系企業での実務経験があるフリーランスエンジニア
- プログラミングスクールでの講師実績あり
- HR領域によるエンジニア特化の採用代行を業務委託で兼務
Seleniumとは
Seleniumは、ブラウザを自動的に操作するライブラリであるため、自動化テストの実施やWebスクレイピングに利用されます。
また、SeleniumはWebサイト・Webアプリに対してブラウザ操作するため、静的ページで構成されたサイトだけでなく動的ページにも対応できます。
特に、SNS等のWebサイト・Webアプリも操作できるので、ログイン機能などが実装されるページにおいても対応できる利点があります。
Seleniumによる要素検索・要素抽出を詳しく知りたい人は、「【Python】 Seleniumとは?インストールから使い方まで徹底解説!」を一読ください。
Webdriverとは
Webdriverは、各driver(ChromeDriverやFireFoxDriverなど)を通じてブラウザと通信します。
また、Webdriverは各driverを通じてブラウザにコマンドを渡し、同ルートを介して情報を受け取ります。
Seleniumのインストール
Seleniumは、Pythonの標準ライブラリとしてインストールされていないため、別途インストールする必要があります。
Seleniumはバージョン3とバージョン4の書き方がネット上で混同されているケースが多いです。
そのため、Seleniumのバージョン確認を実施していただけると幸いです。
ここでは、バージョン3とバージョン4の書き方を並行して記載していきます。
pip show selenium
上記コマンドをMacであればターミナル、Windowsであればコマンドプロンプトで実施すれば、Seleniumのバージョンを確認できます。
pip install selenium==3.141.0
上記のpipコマンドでは、バージョン3を指定していますが任意のバージョンを指定し実施してください。
webdriver(ChromeDriver/EdgeDriver)のインストール
seleniumでは、webdriverとセットで利用する必要があります。
本記事では、最も利用されるChromeDriverによるwebdriverになります。
まだお使いのPCにChromeブラウザがインストールされていない場合、以下のリンクからChromeのダウンロードとインストールを実施してください。
あるいはMicrosoft Edge Chromiumがインストールされていない場合、以下のリンクからダウンロードとインストールを実施してください。
また、ChromeDriverも同様に以下のリンクからダウンロードを実施してください。
- https://sites.google.com/a/chromium.org/chromedriver/downloads
- https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/?form=MA13LH
webdriverのパス指定について、Selenium3と4で異なるため、注意が必要です。
Chrome用とEdge用にて、それぞれSelenium3,4を記載します。
# Selenium 3
from selenium import webdriver
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path="./path/to/driver", options=options)
以下は、改めてSelenium3におけるGoogle Chromeの具体的な手順を示します。
- Chromeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Google Chrome WebDriver
- ダウンロードした
chromedriver.exe
のパスを指定します。
これで、Google Chromeブラウザを使用したSelenium3のテストを実行できます。
# Selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
options = webdriver.ChromeOptions()
service = Service(executable_path="./path/to/driver")
driver = webdriver.Chrome(service=service, options=options)
以下は、改めてSelenium4におけるGoogle Chromeの具体的な手順を示します。
- Edgeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Google Chrome WebDriver
- ダウンロードした
chromedriver.exe
のパスを指定します。
これで、Google Chromeブラウザを使用したSelenium4のテストを実行できます。
# Selenium 3
from selenium import webdriver
options = webdriver.EdgeOptions()
driver = webdriver.Edge(executable_path="./path/to/msedgedriver", options=options)
以下は、改めてSelenium3におけるMicrosoft Edgeの具体的な手順を示します。
- Edgeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Microsoft Edge WebDriver
- ダウンロードした
msedgedriver.exe
のパスを指定します。
これで、Microsoft Edgeブラウザを使用したSelenium3のテストを実行できます。
# Selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service
options = webdriver.EdgeOptions()
service = Service(executable_path="./path/to/msedgedriver")
driver = webdriver.Edge(service=service, options=options)
以下は、改めてSelenium4におけるMicrosoft Edgeの具体的な手順を示します。
- Edgeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Microsoft Edge WebDriver
- ダウンロードした
msedgedriver.exe
のパスを指定します。
これで、Microsoft Edgeブラウザを使用したSelenium4のテストを実行できます。
端的に言えばSelenium3では、直接executable_pathを指定します。
一方で、Selenium4ではServiceオブジェクトを経由してexecutable_pathに渡します。
webdriver-managerのインストール(自動更新)
Seleniumを利用するにあたり、webdriver(ChromeDriver/EdgeDriverなど)をインストールする必要があります。
また、Chrome等のブラウザは定期的にアップデートされ、古いバージョンのwebdriverが使用できなくなるケースがあります。
そのため、webdriverを自動更新するライブラリであるwebdriver-managerのインストールをおすすめします。
pip install webdriver-manager
上記コマンド実施後、Successfullyが表示されればインストール完了です。
また、Selenium3とSelenium4によってPythonファイルへの記述方法が異なります。
# Selenium 3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
# Selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# Selenium 3
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager
driver = webdriver.Edge(executable_path=EdgeChromiumDriverManager().install())
# Selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager
driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
上記コードを記述することで、ブラウザバージョンのアップデートの度に、webdriver更新時の手間が省けます。
Webdriverの対応ブラウザ
上記では、最も利用されるGoogle ChromeブラウザとMicrosoft Edgeブラウザを示しました。
その他にも、Webdriverから各driverを利用できます。
主なdriverは以下の5つです。
メソッド名 | 説明 |
---|---|
.Chrome() | Google Chromeブラウザ |
.Edge() | Microsoft Edgeブラウザ |
.Firefox() | Mozilla Firefoxブラウザ |
.Ie() | IEブラウザ |
.Safari() | Apple Safariブラウザ |
Seleniumの公式ドキュメントにて5つのブラウザに対して操作が可能です。
.ChromeOptions()の使い方
以下のOptionsモジュールをインポートします。
from selenium.webdriver.chrome.options import Options
代表的なオプションは以下です。
また、.add_argument()メソッドで利用します。
オプション名 | 説明 |
---|---|
options.add_argument(‘–blink-settings=imagesEnabled=false’) | 画像の非表示 |
options.add_argument(‘–disable-blink-features=AutomationControlled’) | navigator.webdriver=false とする設定 |
options.add_argument(‘–disable-browser-side-navigation’) | Timed out receiving message from renderer: の修正 |
options.add_argument(‘–disable-dev-shm-usage’) | ディスクのメモリスペースを使う |
options.add_argument(‘–disable-extensions’) | すべての拡張機能を無効 |
options.add_argument(‘–disable-gpu’) | GPUハードウェアアクセラレーションを無効 |
options.add_argument(‘–headless’) | ヘッドレスモードで起動 |
options.add_argument(‘–ignore-certificate-errors’) | SSL認証を無効 |
options.add_argument(‘–incognito’) | シークレットモードで起動 |
options.add_argument(‘–no-sandbox’) | Chromeの保護機能を無効 |
options.add_argument(‘–start-maximized’) | 初期のウィンドウサイズを最大化 |
options.add_argument(‘–window-size=1920,1080’) | 初期のウィンドウサイズを指定 |
特にリモートでSelenium Serverを稼働させる場合など、ヘッドレスモードを利用することが多いです。
以下に利用しやすいコードブロックを記載しておきます。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--blink-settings=imagesEnabled=false') #画像の非表示
options.add_argument('--disable-blink-features=AutomationControlled') #navigator.webdriver=false とする設定
options.add_argument('--disable-browser-side-navigation') #Timed out receiving message from renderer: の修正
options.add_argument('--disable-dev-shm-usage') #ディスクのメモリスペースを使う
options.add_argument('--disable-extensions') #すべての拡張機能を無効
options.add_argument('--disable-gpu') #GPUハードウェアアクセラレーションを無効
options.add_argument('--headless') #ヘッドレスモードで起動
options.add_argument('--ignore-certificate-errors') #SSL認証を無効
options.add_argument('--incognito') #シークレットモードで起動
options.add_argument('--no-sandbox') #Chromeの保護機能を無効
options.add_argument('--start-maximized') #初期のウィンドウサイズを最大化
options.add_argument('--window-size=1920,1080') #初期のウィンドウサイズを指定
# ------ ChromeDriver の起動 ------
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://www.xxxx.jp')
SeleniumのWebDriverWaitの使い方
Seleniumを利用してブラウザ操作する場合、ブラウザに対する待機時間もうまく処理する必要があります。
また、Seleniumにおけるエラーの原因は、指定した要素が見つからないことがほとんどです。
人間の操作より遥かに速い操作でプログラムが処理するため、指定要素の存在有無でエラーを引き起こします。
ここでは、Webdriverの待機処理について解説します。
待機処理では、以下の3つを紹介します。
- .implicitly_wait()による暗黙的な待機処理
- WebDriverWait.until()による明示的な待機処理
- time.sleep()の待機処理
暗黙的・明示的といった単語も含めて解説します。
また、Seleniumで待機処理を実施する場合に以下のWebDriverWaitモジュールをインポートしておきます。
.implicitly_wait()による暗黙的な待機処理
暗黙的な待機処理とは、『ブラウザの表示処理を指定時間内で待機する』ことを指します。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
# Chrome Driverを起動する
driver = webdriver.Chrome(executable_path='path/to/driver', chrome_options=options)
driver.implicitly_wait(10) # 秒
# Webページを開く
driver.get('URL')
# Chrome Driverを終了する
driver.quit()
上記のコードのように、暗黙的な待機処理は共通的な待ち時間を設定できます。
ブラウザの表示が完了すれば、残りの時間を無視して次の処理に移ります。
処理コードは、driver起動直後で問題ありません。
WebDriverWait.until()による明示的な待機処理
暗黙的な待機処理では対応できない(特定要素の読み込みが遅いなど)場合に、明示的な待機処理を追加する必要があります。
WebDriverWait.until()メソッドを利用し、HTML要素が特定の状態になるまで待機する設定ができます。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# Chrome Driverを起動する
driver = webdriver.Chrome(executable_path='path/to/driver', chrome_options=options)
# Webページを開く
driver.get('URL')
# 指定した要素が表示されるまで、明示的に10秒待機する
css_selector = 'css_selector'
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)
# Chrome Driverを終了する
driver.quit()
WebDriverWait.until()メソッドは、『特定要素の状態に対しての待機時間』を設定しています。
また、visibility_of_element_located()メソッドは『特定要素の表示』を設定しています。
他にも待機処理で利用できるメソッドは以下になります。
メソッド名 | 説明 |
---|---|
alert_is_present | Alertが表示されるまで待機する |
element_to_be_clickable | 要素がクリック出来る状態になるまで待機する |
visibility_of_element_located | 指定した要素が表示されるまで待機する |
invisibility_of_element_located | 指定した要素が非表示になるまで待機する |
text_to_be_present_in_element | 指定したテキストが表示されるまで待機する |
presence_of_element_located | 指定した要素がDOM上に現れるまで待機する |
明示的な待機処理に関しては、WebページのHTMLデータを取得後に実行しましょう。
time.sleep()の待機処理
暗黙的・明示的な待機処理が利用できないケースの場合は、time.sleep()メソッドを利用しましょう。
import time
time.sleep(10) # 秒
time.sleep()メソッドは、強制的に指定時間を待機してしまうため、全体の処理が遅れてしまいます。
ただ、複雑なプログラムになるとブラウザ操作以外に処理するコードが多くなり、selenium以外の処理で時間を要する場合があります。
その際に、Seleniumでは処理できない別処理の待機はtime.sleep()メソッドを利用します。
WebDriverにおけるタブ・ウィンドウの切り替え方法
Selenium3とSelenium4では、それぞれタブ・ウィンドウの切り替え方法が異なります。
Selenium4は新しいドライバーオブジェクトを作成せず、同じセッションで新しいタブやウィンドウを作成し、フォーカスできます。
そのため、Selenium4は新しいタブあるいは新しいウィンドウを作成し自動的に切り替えるAPIである.new_window
が用意されています。
一方でSelenium3は、URLを新しいタブあるい新しいウィンドウを作成後、ハンドルの切り替えswitch_to.window()
を実行する必要があります。
Selenium3 | メソッド |
---|---|
タブの作成 | driver.execute_script(“window.open()”) |
タブの切り替え | driver.switch_to.window(driver.window_handles[1]) |
Selenium4 | メソッド |
---|---|
タブの作成/切り替え | driver.switch_to.new_window(“tab”) |
ウィンドウの作成/切り替え | driver.switch_to.new_window(“window”) |
どちらもタブ・ウィンドウ作成後、前のタブ・ウィンドウに戻したい場合はハンドルの切り替えで調整しましょう。
仮に作成後のタブ・ウィンドウの作業が終了し、 ブラウザーで最後に開いたウィンドウまたはタブではない場合、以前使用していたタブ・ウィンドウに切り替える必要があります。
ウィンドウを閉じた後に、別のウィンドウハンドルに切り替えを忘れると、現在閉じられたページでWebDriverが実行されたままになり、No Such Window Exception
といったエラーが発生します。
Seleniumの実行を継続するには、有効なウィンドウハンドルに切り替える必要があるため注意しましょう。
Seleniumによるエラー時の対処
Seleniumによるスクレイピングプログラムを実行する際に、いくつかのエラーあるいは突破しなければならない課題があります。
以下が主なエラーに対する対処内容になります。
- 指定したHTML要素が見つからない時(InvalidSelectorExceptionやNoSuchElementException)
- 特定サイトの無応答時(タイムアウト)
それぞれのエラーに対する対処方法を解説します。
指定したHTML要素が見つからない時(InvalidSelectorExceptionやNoSuchElementException)
上述したように、Seleniumによる大半のエラーの原因は、指定した要素が見つからないことです。
そのため、Timeout時のエラー対処を解説します。
Pythonでは、エラー通知にtry-except文を利用します。
from selenium.common.exceptions import TimeoutException
try:
# 指定した要素が表示されるまで、明示的に10秒待機する
css_selector = 'css_selector'
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)
except TimeoutException as e:
# 失敗時の処理
あるいは、関数を利用して再処理を実施すると良いです。
# リトライして失敗したらエラーメッセージを通知する。成功したらelementを返す
def getElement(css_selector, wait_second, retries_count):
error = ''
for _ in range(retries_count):
try:
# 失敗しそうな処理
css_selector = 'css_selector'
element = WebDriverWait(driver, wait_second).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)
except TimeoutException as e:
# エラーメッセージを格納する
error = e
else:
# 失敗しなかった場合は、ループを抜ける
break
else:
# リトライが全部失敗したときの処理
# エラー内容(error)や実行時間、操作中のURL、セレクタ、スクショなどを通知する。
do_something() # 好きな処理
# プログラムを強制終了する
sys.exit(1)
return element
element = getElement('css_selector', {{ 待機時間 }}, {{ リトライする回数 }})
エラーが発生した場合に、任意の回数分をリトライすることで待機処理ではカバーしきれない通信不具合の状況なども対処できます。
特定サイトの無応答時(タイムアウト:timeout)
特定サイトの無応答時のタイムアウトには、Seleniumによる自動制御を事前にアクセス拒否してるケースもあります。
つまり、Webスクレイピングしたいが特定サイト側でnavigator.webdriver=true
なブラウザだとNGなサイトであるわけです。
上記の場合は、navigator.webdriver=False
に設定する必要があります。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# ------ ChromeDriver の起動 ------
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
#print(driver.execute_script('return navigator.webdriver'))
Optionsモジュールをインポート後、.add_argument()メソッドにてオプション設定を行います。
options.add_argument('--disable-blink-features=AutomationControlled')
を追加することで、navigator.webdriver=true
からnavigator.webdriver=False
へ変更できます。
変更後にプログラムを実施すると、Seleniumによるスクレイピングを拒否されることなく実行できます。
driver.execute_script('return navigator.webdriver')
driverの起動コードの下に、print文を追加し上記のコードを記述すると、navigator.webdriver
の設定を確認できます。
本格的にエンジニアへのキャリアチェンジを考えてる人へ
プログラミングスキルを社内やプライベートで活用している人が増えています。
- 一部業務プロセスの効率化/自動化
- 分析システム構築による担当業務改善
- 社内公開によるチーム/プロジェクトの業務時間短縮
Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。
また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。
一度、あなたのキャリアプランを振り返ってみてください。
- 収入アップが見込めている
- キャリアアップが見込めている
- 働き方を明確に決めれている
上記の項目をYESと答えられる人は、特に言うことはありません。
現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。
コメント