Skip to content

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年リリース)で古いメソッドが完全に削除されたために発生します。以下のような従来のコードは動作しなくなります:

python
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クラスを組み合わせて使用します:

python
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: 文字列で指定する

より簡潔な方法として、直接文字列でロケーターの種類を指定することもできます:

python
element = driver.find_element("xpath", '//input[@name="username"]')

WARNING

文字列指定でも動作しますが、Byクラスを使用する方がコードの可読性とメンテナンス性が向上します。

複数要素を取得する場合

複数の要素を取得する場合も同様に変更が必要です:

python
# 古い書き方(非推奨)
elements = driver.find_elements_by_xpath('//div[@class="item"]')

# 新しい書き方(推奨)
elements = driver.find_elements(By.XPATH, '//div[@class="item"]')

コード例の修正

元のコードを修正すると以下のようになります:

python
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)を使用することを推奨します:

python
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_*メソッドは削除されています。代わりに以下のパターンを使用してください:

  1. from selenium.webdriver.common.by import By をインポート
  2. driver.find_element(By.XPATH, xpath_expression) 形式を使用
  3. 明示的待機を活用してテストの信頼性を向上

この変更は、より一貫性のあるAPIとコードの明示性向上を目的として実施されました。