はじめに
以前投稿したSeleniumの記事を書くための調査で私用PCのSeleniumを3から4に上げたんですが、それに伴ってcronで定期実行していた既存のSelenium3のログに大量のWarningが出るようになりました。
Warningなのでコード自体は正常終了するのですが、ログが無駄に長くなるのは嫌なのでSelenium4のソースコードを分析して自分のコードを修正し、全てのWarningを消すことに成功したのでここに備忘録を残しておきます。
DeprecationWarning: executable_path has been deprecated, please pass in a Service object
Selenium3では、ブラウザのドライバにPATHを通さない場合は以下のようにドライバを起動していました。
from selenium import webdriver
driver = webdriver.Firefox(executable_path="/usr/local/bin/geckodriver")
driver.get('https://www.google.com/')
ですが、Selenium4で同じことをしたいはドライバ起動時に直接executable_path
を渡すのではなく、以下のようにService
オブジェクトにexecutable_path
を渡し、そのService
オブジェクトを渡す必要があります。
from selenium import webdriver
from selenium.webdriver.firefox import service as fs
firefox_servie = fs.Service(executable_path="/usr/local/bin/geckodriver")
driver = webdriver.Firefox(service=firefox_servie)
driver.get('https://www.google.com/')
DeprecationWarning: service_log_path has been deprecated, please pass in a Service object
ログの出力先を指定する場合、executable_path
と同様service_log_path
もService
オブジェクトに渡す仕様になりました。ただ以下の2点に気をつけてください。
①キーワードの名前がservice_log_path
ではなくlog_path
になる
②ブラウザドライバがPATHに通っていてもService
オブジェクトにexecutable_path
を渡す必要がある。
なのでこの場合、上の4行目は以下のようになります。
firefox_servie = fs.Service(executable_path="/usr/local/bin/geckodriver", log_path='/my/log/path')
UserWarning: find_element_by_* commands are deprecated. Please use find_element() instead
メッセージの通りですが、find_element_by_*
という名前の関数はdeprecatedになり、by_*
の部分はfind_element()
のキーワード変数by
で指定するようになりました。
例えば、Selenium3の以下のコードがあったとします。
(ドライバの実行ファイルにはPATHが通っていることとします)
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://www.google.com/')
element = driver.find_element_by_xpath("//input[@type='text']")
element.send_keys('Qiita')
element.submit()
これをSelenium4仕様にすると以下のようになります。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get('https://www.google.com/')
element = driver.find_element(by=By.XPATH, value="//input[@type='text']")
element.send_keys('Qiita')
element.submit()
まとめ
find_element
の書き換えはかなり面倒なので、テストコードが大量にある場合はスクリプトを書いていい感じに自動化しないと大変そうですね。