スクレイピング中にSeleniumで固有のエラーが起きた時の例外処理を書きたかったのですが、
seleniumの場合は起こる時もあれば起こらない時もあったりでしばらく上手くいっていると忘れてしまうので
よくあるエラーについて書きました。
- Selenium初心者向け
- 起こっているエラーがどんなエラーなのか知りたい人
- エラーに対する対処・原因が知りたい人
- seleniumでの例外処理が上手くいかない人
- try〜exceptで『定義されていません』が出て困っている人
に向けて書いております。
よく起きるSelenium固有エラーと説明
seleniumを動かしていてよく起きるエラーの一覧です。
NoSuchElementException:
要素が見つからない場合に発生します。
例えば、find_element_by_() メソッドで要素を見つけられなかった場合にこのエラーが発生します。
エラーメッセージの例:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"***","selector":"***"}
このエラーが出る主な状況
TimeoutException:
指定した時間内に要素が読み込まれなかった場合に発生します。
WebDriverWait を使用して要素が読み込まれるまで待機する際に、タイムアウトが発生した場合にこのエラーが発生します。
エラーメッセージの例:
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 10.000
このエラーが出る主な状況
StaleElementReferenceException:
要素がDOMから削除された後に、その要素を操作しようとした場合に発生します。
ページが再読み込みされたり、要素が動的に変更されたりすると、要素が “stale” になり、このエラーが発生します。
エラーメッセージの例:
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
このエラーが出る主な状況
このエラーは、Seleniumで要素を操作する際に非常に一般的であり、特にページが動的である場合や、要素が頻繁に更新される場合に発生しやすいです。
このエラーを回避するためには、要素を再度取得するか、要素が “stale” になる可能性がある操作を実行する前にページを更新する必要があります。
ElementNotInteractableException:
要素が操作可能な状態にない場合に発生します。
例えば、クリックやテキスト入力ができない要素に対してこれらの操作を試みた場合にこのエラーが発生します。
エラーメッセージの例:
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
このエラーが出る主な状況
これらの状況のいずれかが発生すると、要素が操作不可能な状態になり、ElementNotInteractableException
がスローされます。
このエラーを回避するためには、要素が操作可能な状態になるまで待機するか、操作を行う前に要素の状態を確認する必要があります。
InvalidSelectorException:
セレクタが無効な場合に発生します。
find_element_by_() メソッドで無効なセレクタを使用した場合などにこのエラーが発生します。
エラーメッセージの例:
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified
このエラーが出る主な状況
WebDriverException:
WebDriverに関連する一般的な例外です。
例えば、WebDriverの初期化中に問題が発生した場合や、ブラウザがクラッシュした場合などに発生します。
この場合のエラーメッセージは、その問題によって異なります。
特定のエラーについては、そのエラーメッセージを確認する必要があります。
このエラーが出る主な状況
WebDriverException
は非常に汎用的な例外であり、ほとんどの場合、より具体的な例外(NoSuchElementException
、TimeoutException
、StaleElementReferenceException
など)が適切です。
しかし、予期しない問題やドライバーの内部エラーに対処する際に使用されることがあります。
try〜expectで『”xx”が定義されていません』
VS Codeの場合、例えば『except NoSuchElementException:』と書くと、『NoSuchElementExceptionが定義されていません』とエラーが出て、
そのまま実行をすると正常に動作しません。
例えばこのようなコードを書く場合 ↓
try:
element = driver.find_element_by_id("non_existent_element")
except NoSuchElementException:
print("要素が見つかりませんでした。")
Pythonの標準的な例外では追加のインポートが必要ありませんが、
Selenium固有のエラーはインポートの必要があります。
最初にインポートしておく↓
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id("non_existent_element")
except NoSuchElementException:
print("要素が見つかりませんでした。")
他のエラーの場合は『NoSuchElementException』の部分を変更する必要があります。