記事内に広告が含まれています。

【例外処理】一般的なSelenium固有のエラーについて:Python(初心者用)

【例外処理】一般的なSelenium固有のエラーについて(Pythonスクレイピング初心者用) IT
IT

スクレイピング中に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":"***"}

このエラーが出る主な状況

  • 要素が存在しない場合:
    • find_element_by_***() メソッドを使用して要素を探したが、その要素がHTMLドキュメント内に存在しない場合に発生します。
  • 要素がまだロードされていない場合:
    • ページの読み込みが完了する前に要素を探した場合に発生します。ページがまだ読み込み中であるか、要素が遅延読み込みされている場合にこのエラーが発生します。
  • 要素が非表示の場合:
    • 要素が表示されていない(CSSスタイルで display: none に設定されているなど)場合にもこのエラーが発生します。
  • 要素が非アクセス可能な場所にある場合:
    • 要素がフレーム内にあり、そのフレームが現在のコンテキストではアクセスできない場合に発生します。
  • セレクタが間違っている場合:
    • 要素を検索するためのセレクタが誤っている場合にも、このエラーが発生する可能性があります。

TimeoutException:

指定した時間内に要素が読み込まれなかった場合に発生します。
WebDriverWait を使用して要素が読み込まれるまで待機する際に、タイムアウトが発生した場合にこのエラーが発生します。

エラーメッセージの例:

selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 10.000

このエラーが出る主な状況

  • 要素が読み込まれるまで待機する際のタイムアウト:
    • WebDriverWait を使用して要素が読み込まれるのを待つ場合に、指定された時間内に要素が読み込まれない場合にこのエラーが発生します。
      タイムアウト時間は、WebDriverWait クラスのコンストラクタで指定されます。
  • ページが読み込み中のままである場合:
    • ページの読み込みが完了する前に要素を探した場合にも、このエラーが発生する可能性があります。
      ページがまだ読み込み中であるか、要素が遅延読み込みされている場合にこのエラーが発生します。
  • ネットワークの遅延やサーバーの負荷:
    • ウェブページが読み込まれるのに時間がかかる、またはサーバーが応答しない場合にも、このエラーが発生する可能性があります。
  • 要素が存在せず、タイムアウトが設定されている場合:
    • find_element_by_***() メソッドを使用して要素を探したが、その要素がHTMLドキュメント内に存在しない場合に、タイムアウトが発生します。
  • 要素が非表示である場合:
    • 要素が非表示の(CSSスタイルで display: none に設定されているなど)場合にも、タイムアウトが発生する場合があります。
     

StaleElementReferenceException:

要素がDOMから削除された後に、その要素を操作しようとした場合に発生します。
ページが再読み込みされたり、要素が動的に変更されたりすると、要素が “stale” になり、このエラーが発生します。

エラーメッセージの例:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

このエラーが出る主な状況

  • DOMの更新:
    • ページがダイナミックであり、JavaScriptなどの操作によって要素が追加、削除、更新される場合、以前に取得した要素が更新される可能性があります。
      これにより、以前の要素への参照が無効になり、StaleElementReferenceException が発生します。
  • ページの再読み込み:
    • ページが再読み込みされた場合、以前の要素への参照が無効になります。
      たとえば、ページが更新されたり、新しい要素が追加されたりすると、以前の要素が “stale” になり、このエラーが発生します。
  • 非同期処理:
    • ページが非同期的に要素を更新する場合、要素の状態が変化する可能性があります。
      以前に取得した要素が現在の状態と一致しない場合、StaleElementReferenceException が発生します。

このエラーは、Seleniumで要素を操作する際に非常に一般的であり、特にページが動的である場合や、要素が頻繁に更新される場合に発生しやすいです。
このエラーを回避するためには、要素を再度取得するか、要素が “stale” になる可能性がある操作を実行する前にページを更新する必要があります。

ElementNotInteractableException:

要素が操作可能な状態にない場合に発生します。
例えば、クリックやテキスト入力ができない要素に対してこれらの操作を試みた場合にこのエラーが発生します。

エラーメッセージの例:

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

このエラーが出る主な状況

  • 要素が非表示の場合:
    • 要素が表示されておらず、ユーザーが対話することができない場合に発生します。
      例えば、CSSスタイルで display: none に設定されている要素や、透明度が0の要素などが該当します。
  • 要素が無効になっている場合:
    • 要素が無効になっており、クリックやテキスト入力などの操作を受け付けない場合に発生します。
      一般的な例として、テキストボックスが disabled 属性で無効化されている場合が挙げられます。
  • 要素が親要素によって隠されている場合:
    • 要素が親要素によって隠されている場合、子要素に対して操作が不可能となり、このエラーが発生します。
      例えば、要素が overflow: hidden の親要素に含まれている場合などが該当します。
  • 要素が画面外にある場合:
    • 要素が画面外にある場合、ユーザーが要素に対して操作を行うことができず、このエラーが発生します。
  • 要素が読み取り専用である場合:
    • 読み取り専用の要素(例えば、テキストやリンクなど)に対して、書き込み操作を試みた場合にこのエラーが発生します。

これらの状況のいずれかが発生すると、要素が操作不可能な状態になり、ElementNotInteractableException がスローされます。
このエラーを回避するためには、要素が操作可能な状態になるまで待機するか、操作を行う前に要素の状態を確認する必要があります。

     

InvalidSelectorException:

セレクタが無効な場合に発生します。
find_element_by_() メソッドで無効なセレクタを使用した場合などにこのエラーが発生します。

エラーメッセージの例:

selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified

このエラーが出る主な状況

  • 無効なセレクタ文字列:
    • CSSセレクタやXPathの文字列が無効であり、要素を特定するための正しい構文や形式に準拠していない場合に、このエラーが発生します。
      たとえば、閉じられていない括弧や引用符、間違った構文などが該当します。
  • 要素が見つからない場合:
    • セレクタが正しくないため、要素を特定することができない場合に、このエラーが発生します。
      セレクタがHTMLドキュメント内の要素を正しく指定していないか、要素が存在しない場合に発生する可能性があります。
  • 無効なXPath表現:
    • XPath表現が無効であり、要素を特定するための正しいXPath構文に従っていない場合に、このエラーが発生します。
      XPathが不完全であったり、間違った軸や述語が含まれていたりする場合が該当します。
  • セレクタのタイプミスマッチ:
    • 要素を特定するためのセレクタが、その要素の種類に適していない場合に、このエラーが発生します。
      たとえば、CSSセレクタでテキスト要素を指定しようとした場合などが該当します。

WebDriverException:

WebDriverに関連する一般的な例外です。
例えば、WebDriverの初期化中に問題が発生した場合や、ブラウザがクラッシュした場合などに発生します。

この場合のエラーメッセージは、その問題によって異なります。
特定のエラーについては、そのエラーメッセージを確認する必要があります。

このエラーが出る主な状況

  • ドライバーが予期せず終了した場合:
    • ドライバーがクラッシュしたり、突然終了したりした場合に、このエラーが発生します。
      これは、ブラウザの互換性の問題や、Seleniumドライバー自体のバグによるものです。
  • ページが完全に読み込まれなかった場合:
    • ページの読み込みが中断されたり、タイムアウトしたりする場合に、このエラーが発生します。
      これは、ネットワークの問題や、ページ内の要素の問題によるものです。
  • ブラウザが操作を拒否した場合:
    • ブラウザが要求された操作を拒否した場合に、このエラーが発生します。
      たとえば、ブラウザのセキュリティ設定により、スクリプトが実行されない場合があります。
  • ドライバーの起動時に問題が発生した場合:
    • ドライバーが起動できない、または初期化できない場合に、このエラーが発生します。
      これは、ドライバーのパスや設定に問題がある場合に発生します。
  • その他の予期せぬ問題:
    • 上記に当てはまらないその他の問題が発生した場合にも、このエラーが発生する可能性があります。

WebDriverException は非常に汎用的な例外であり、ほとんどの場合、より具体的な例外(NoSuchElementExceptionTimeoutExceptionStaleElementReferenceException など)が適切です。

しかし、予期しない問題やドライバーの内部エラーに対処する際に使用されることがあります。

     

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』の部分を変更する必要があります。