Selenium 4.3.0でのfind_element_by_xpathエラー解決方法
Web自動化テストでSeleniumを使用している際に、AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
というエラーが発生する場合、これはSelenium 4.3.0での重要な変更が原因です。
問題の原因
このエラーは、Selenium 4.3.0(2022年リリース)で古いメソッドが完全に削除されたために発生します。以下のような従来のコードは動作しなくなります:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
# これまで使えていたが、Selenium 4.3.0以降では動作しない
element = driver.find_element_by_xpath('//input[@name="username"]')
解決方法
方法1: Byクラスを使用する(推奨)
find_element_by_xpath()
の代わりに、find_element()
メソッドとBy
クラスを組み合わせて使用します:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://example.com')
# 新しい書き方
element = driver.find_element(By.XPATH, '//input[@name="username"]')
TIP
By
クラスは以下の定数を提供します:
By.ID
By.NAME
By.XPATH
By.CLASS_NAME
By.CSS_SELECTOR
By.LINK_TEXT
By.PARTIAL_LINK_TEXT
By.TAG_NAME
方法2: 文字列で指定する
より簡潔な方法として、直接文字列でロケーターの種類を指定することもできます:
element = driver.find_element("xpath", '//input[@name="username"]')
WARNING
文字列指定でも動作しますが、By
クラスを使用する方がコードの可読性とメンテナンス性が向上します。
複数要素を取得する場合
複数の要素を取得する場合も同様に変更が必要です:
# 古い書き方(非推奨)
elements = driver.find_elements_by_xpath('//div[@class="item"]')
# 新しい書き方(推奨)
elements = driver.find_elements(By.XPATH, '//div[@class="item"]')
コード例の修正
元のコードを修正すると以下のようになります:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
test = webdriver.Chrome()
test.get('https://docs.google.com/forms/d/e/1FAIpQLSeYUmAYYZNtbU8t8MRxwJo-d1zkmSaEHodJXs78RzoG0yFY2w/viewform')
time.sleep(5)
Name = 'kuch bhi'
# 修正後のコード
last = test.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')
last.send_keys(Name)
ベストプラクティス
INFO
time.sleep()
の代わりに明示的待機(Explicit Wait)を使用することを推奨します:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@name="username"]')))
element.send_keys('text')
まとめ
Selenium 4.3.0以降では、find_element_by_*
およびfind_elements_by_*
メソッドは削除されています。代わりに以下のパターンを使用してください:
from selenium.webdriver.common.by import By
をインポートdriver.find_element(By.XPATH, xpath_expression)
形式を使用- 明示的待機を活用してテストの信頼性を向上
この変更は、より一貫性のあるAPIとコードの明示性向上を目的として実施されました。