導入
Selenium を自動テストまたは Web ページ データのクロールに使用すると、InvalidElementStateException
多くの場合例外が発生します。この例外は通常、クリックやテキストの入力など、非インタラクティブな要素に対して操作を実行しようとしたときに発生します。InvalidElementStateException
この記事では、例外が発生する原因と解決方法について詳しく説明します。
問題の原因分析
InvalidElementStateException
例外は通常、次の状況で発生します。
-
要素が表示されていないか、覆われています: 他の要素によって表示されていないか、覆われていないページ上の要素を操作してみます。
-
要素が無効になっています: ボタンをクリックするなど、無効になっている要素を操作してみます。
-
要素は編集できません: 読み取り専用の入力ボックスなど、編集できない要素にテキストを入力してみてください。
-
ページの読み込みが不完全です: ページの読み込みが不完全な要素と対話しようとします。続行する前に、ページが読み込まれるまで待つ必要がある場合があります。
問題が解決しました
InvalidElementStateException
例外を解決する方法は次のとおりです。
- 方法 1: 要素が表示されるまで待機します。
Selenium が提供する待機メカニズムを使用して要素が表示されるまで待ってから、要素との対話を試みます。WebDriverWait
以下を使用して待機を実装できますexpected_conditions
。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'element_id')))
- 方法 2: 要素のステータスを確認する
操作を実行する前に、要素の状態をチェックして対話型であることを確認してください。たとえば、要素が編集可能 (有効) かどうかを確認できます。
element = driver.find_element(By.ID, 'element_id')
if element.is_enabled():
element.click()
else:
print("元素不可交互")
- 方法 3: ページが読み込まれるまで待ちます
InvalidElementStateException
ページが完全に読み込まれていないために例外が発生する場合があります。ページが完全にロードされるまで待ってから、要素を操作してみます。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待页面加载完成
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, 'element_id')))
- 方法 4: 例外をキャッチする
要素を操作しようとするときは、try
andexcept
ステートメントを使用して例外をキャッチしInvalidElementStateException
、一定時間待機して再試行するなどの適切なアクションを実行できます。
from selenium.common.exceptions import InvalidElementStateException
import time
try:
element = driver.find_element(By.ID, 'element_id')
element.click()
except InvalidElementStateException:
print("捕获到InvalidElementStateException异常,等待一段时间后重试")
time.sleep(5) # 等待5秒
element.click()
- 方法 5: ページ構造を表示する
場合によっては、InvalidElementStateException
ページ構造の変更によって例外が発生することがあります。ページが変更されたかどうかを確認し、それに応じてテスト スクリプトを更新できます。
要約する
InvalidElementStateException
通常、非インタラクティブな要素を操作しようとすると例外が発生します。この問題は、Selenium が提供する待機メカニズムを使用し、要素のステータスをチェックし、ページの読み込みが完了するのを待つなどすることで解決できます。この例外を解決するには、デバッグとテストが必要であり、正確な解決策はテスト シナリオとページの詳細によって異なります。これらの方法をマスターすると、Selenium 自動テスト スクリプトをより安定して確実に作成できるようになります。