LoginSignup
40
37

More than 3 years have passed since last update.

【Python】Selenium3から4へ上げたらWarningが出た【WebDriver】

Posted at

はじめに

以前投稿した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_pathServiceオブジェクトに渡す仕様になりました。ただ以下の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の書き換えはかなり面倒なので、テストコードが大量にある場合はスクリプトを書いていい感じに自動化しないと大変そうですね。

40
37
1

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
40
37