Selenium FirefoxDriver(GeckoDriver)を自動更新する【Python】
Firefoxでブラウザ操作自動化をしてるけど、ブラウザバージョン更新のたびにFirefoxDriverを手動更新するのが面倒。
自動更新する方法はないものか...?
そんな悩みを抱えているかたへ、解決法を。
【Windows・Mac共通】
Seleniumバージョン4.12以上ならこれ↓だけで、Firefoxブラウザ未インストール状態でも起動可。
Pythonfrom selenium import webdriver
driver = webdriver.Firefox()
Selenium 4.11以下の場合、以下どちらか
- Selenium 最新版へ更新して上記記法に書き換え
- 更新できないなら、"webdriver-manager"を使って書き換え
Selenium 4.6から、Selenium自体にChrome、Edge、Firefoxのドライバー自動更新機能「Selenium Manager」が搭載されました。
関連【Selenium】ChromeDriver自動更新で楽する方法【Python】
関連Selenium EdgeDriverを自動更新する【Python】
また、2023年9月リリースのSelenium4.12からFirefoxブラウザがPCにインストールされていなくても起動できるように。
今までFirefoxDriver自動更新といえば「webdriver-manager」をインストールして使うのが定番でしたが、もう不要です。
Selenium Managerの技術的な仕組みなど細かいことは他へ譲るとして、本記事はFirefoxDriver自動更新の実現方法のみにフォーカスします。
参考selenium.dev:What's new in Selenium Manager 0.4.12, shipped with Selenium 4.12.0
ー もくじ ー
Python FirefoxDriver(GeckoDriver)を自動更新する準備
現在どのSeleniumバージョンを利用しているかによって、対応が少しずつ異なります。
pip show seleniumでまず現バージョンをチェックしてみてください。
> pip show selenium
Name: selenium
Version: 4.1.4
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: /usr/local/lib/python3.9/site-packages
Requires: urllib3
Required-by: PyPasser
現Seleniumのバージョンがどれかによって手順を分けて書いていきます。
Selenium 4.12以上を使っている場合
既存コードのわずかな書き換えのみなので10秒で終わります。
こう↓するだけです。
AFTERfrom selenium import webdriver
driver = webdriver.Firefox()
ヘッドレスモード実行など、optionsを指定する場合は今まで通り。
AFTERfrom selenium import webdriver
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
driver = webdriver.Firefox(options=options)
これで実行してみて、無事にFirefoxが起動すれば成功です。
webdriver.Firefox()とするだけで、裏側でSelenium Managerが自動的に適切なドライバーをダウンロードするような動きになっています(すでに存在する場合、キャッシュから読み込まれる)。
今後、FirefoxDriverのバージョンを意識することはありません。
Selenium 4.0 〜 4.11を使っている場合
2つの手段があります。状況によりどちらか選びましょう。
- 最新版(4.12以上)へ更新 → コード書き換え
- webdriver-managerを使って書き換え
方法1. 最新版へ更新 → コード書き換え
以下、Seleniumを更新できる場合の手順です。
▼1. Selenium更新
これでSeleniumが最新版へ更新されます。
pip install -U selenium
> pip install -U selenium
Requirement already satisfied: selenium in /usr/local/lib/python3.9/site-packages (4.1.4.)
Collecting selenium
・・・省略・・・
Uninstalling selenium-4.1.4:
Successfully uninstalled selenium-4.1.4
Successfully installed selenium-4.12.0
▼2. コード書き換え
「Selenium 4.12以上を使っている場合」章を参考にコードを書き換えてください。
その後、無事にFirefoxが起動すれば成功、終わりです。
方法2. webdriver-managerを使う書き換え
何らか事情があってSeleniumバージョン更新ができない場合、webdriver-managerというライブラリを使うことでFirefoxDriverの自動更新が実現できます。
以下、導入手順です。
- webdriver-managerをインストール
- 既存コードを書き換え
▼1. インストール
pip install webdriver-manager
> pip install webdriver-manager
Collecting webdriver-manager
Obtaining dependency information for webdriver-manager from https://files.pythonhosted.org/packages/19/5a/a16653bfce685c9832217d377f52065351eeac9862e44e2996cd81f3bb4d/webdriver_manager-4.0.0-py2.py3-none-any.whl.metadata
Using cached webdriver_manager-4.0.0-py2.py3-none-any.whl.metadata (11 kB)
Requirement already satisfied: requests in /usr/local/lib/python3.9/site-packages (from webdriver-manager) (2.26.0)
Requirement already satisfied: python-dotenv in /usr/local/lib/python3.9/site-packages (from webdriver-manager) (1.0.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from webdriver-manager) (23.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.9/site-packages (from requests->webdriver-manager) (1.26.16)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.9/site-packages (from requests->webdriver-manager) (2022.12.7)
Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.9/site-packages (from requests->webdriver-manager) (2.0.4)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/site-packages (from requests->webdriver-manager) (2.10)
Using cached webdriver_manager-4.0.0-py2.py3-none-any.whl (27 kB)
Installing collected packages: webdriver-manager
Successfully installed webdriver-manager-4.0.0
Successfully installed...と表示されればOKです。
▼2. コード書き換え
こう↓します。
AFTERfrom selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
参考GitHub:webdriver-manager README
ヘッドレスモード実行などoptionsを指定する場合は、以下5, 6, 7行目のようにoptions引数を放り込むだけです。
AFTERfrom selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
from webdriver_manager.firefox import GeckoDriverManager
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()), options=options)
これで実行してみて、無事にFirefoxが起動すれば成功、終わりです。
Selenium 3.xを使っている場合
2つの手段があります。状況によりどちらか選びましょう。
- 最新版(4.12以上)へ更新 → コード書き換え
- webdriver-managerを使う書き換え
方法1. 最新版へ更新 → コード書き換え
以下、Seleniumを更新できる場合の手順です。
▼1. Selenium更新
これでSeleniumが最新版へ更新されます。
pip install -U selenium
> pip install -U selenium
Requirement already satisfied: selenium in /usr/local/lib/python3.9/site-packages (3.141.0.)
Collecting selenium
・・・省略・・・
Uninstalling selenium-3.141.0:
Successfully uninstalled selenium-3.141.0
Successfully installed selenium-4.12.0
▼2. コード書き換え①
selenium 3と4ではfind_element系メソッドの記法が少し違うため、そのまま実行するとエラーが出てしまいます。
BEFORE → AFTERへ書き換えましょう。Byインポートを忘れずに。
Python# BEFORE
find_element_by_id("id")
find_element_by_name("name")
find_element_by_xpath("xpath")
find_element_by_link_text("link text")
find_element_by_partial_link_text("partial link text")
find_element_by_tag_name("tag name")
find_element_by_class_name("class name")
find_element_by_css_selector("css selector")
# AFTER
from selenium.webdriver.common.by import By
find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")
参考selenium-python.readthedocs.io:Locating Elements
▼2. コード書き換え②
次は、FirefoxDriverの初期化部分をこう↓します。
AFTERfrom selenium import webdriver
driver = webdriver.Firefox()
ヘッドレスモード実行など、optionsを指定する場合は今まで通り。
AFTERfrom selenium import webdriver
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
driver = webdriver.Firefox(options=options)
これで実行してみて、無事にFirefoxが起動すれば成功です。
今後、FirefoxDriverのバージョンを意識することはありません。
方法2. webdriver-managerを使う書き換え
何らか事情があってSeleniumバージョン更新ができない場合、webdriver-managerというライブラリを使うことでFirefoxDriverの自動更新が実現できます。
以下、導入手順です。
- webdriver-managerをインストール
- 既存コードを書き換え
▼1. インストール
pip install webdriver-manager
> pip install webdriver-manager
Collecting webdriver-manager
Obtaining dependency information for webdriver-manager from https://files.pythonhosted.org/packages/19/5a/a16653bfce685c9832217d377f52065351eeac9862e44e2996cd81f3bb4d/webdriver_manager-4.0.0-py2.py3-none-any.whl.metadata
・・・省略・・・
Successfully installed webdriver-manager-4.0.0
Successfully installed...と表示されればOKです。
▼2. コード書き換え
こう↓します。
AFTERfrom selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
参考GitHub:webdriver-manager README
ヘッドレスモード実行などoptionsを指定する場合は、以下4, 5, 6行目のようにwebdriver.Firefox()にoptions引数を放り込むだけです。
Python(ヘッドレスモードで実行)from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install(), options=options)
これで実行してみて、無事にFirefoxが起動すれば成功、終わりです。
まとめ:Firefox自動更新はSelenium 4.12で超ラクになった
現在Selenium 4.12以上を使っているのに、FirefoxDriverをダウンロードしてきてコードの中にパスをベタ書きして運用しているかたがいるのではないか...?と思いました。
また、これまではFirefoxDriver自動更新=webdriver-managerをインストールして使うというのが定番でしたが、これも不要に。
記事中で何度も何度も書いたことですが、Seleniumを最新に更新さえすれば
driver = webdriver.Firefox()
と書くだけなので、ぜひお試しください。