よくあるエラーについて

Selenium コードで発生する様々な問題の解決方法。

InvalidSelectorException

CSS セレクタと XPath セレクタは、正しく記述するのが難しい場合があります。

考えられる原因

使用しようとしている CSS セレクタまたは XPath セレクタに、無効な文字または無効なクエリが含まれています。

考えられる解決策

バリデータサービスでセレクタを実行してください

または、既知の有効な値を取得するためにブラウザ拡張機能を使用してください

NoSuchElementException

要素は、要素を特定しようとした正確な瞬間に見つかりませんでした。

考えられる原因

  • 要素を探している場所が間違っています(おそらく、以前のアクションが失敗しました)。
  • 要素を探しているタイミングが間違っています(要素がまだ DOM に表示されていません)。
  • コードを書いた後、ロケータが変更されました

考えられる解決策

  • 期待するページにいること、およびコード内の以前のアクションが正しく完了したことを確認してください
  • 適切な待機戦略を使用していることを確認してください
  • ブラウザの開発者ツールコンソールでロケータを更新するか、次のようなブラウザ拡張機能を使用してください

StaleElementReferenceException

要素が以前に特定されたものの、現在アクセスできなくなった場合、要素は「Stale(陳腐化)」します。要素は自動的に再配置されません。ドライバは要素の参照 ID を作成し、DOM 内の特定の場所で要素が見つかることを期待します。現在の DOM 内で要素が見つからない場合、その要素を使用するアクションはすべてこの例外を引き起こします。

考えられる原因

これは、次の場合に発生する可能性があります

  • ページをリフレッシュした場合、またはページの DOM が動的に変更された場合。
  • 別のページに移動した場合。
  • 別のウィンドウに切り替えた場合、またはフレームや iframe の内外に切り替えた場合。

考えられる解決策

DOM が変更された場合

ページがリフレッシュされたり、ページ上のアイテムが移動したりした場合、目的のロケータを持つ要素がページ上にまだ存在しますが、使用されている要素オブジェクトからはアクセスできなくなっているだけであり、再度使用する前に要素を再配置する必要があります。これは通常、次の 2 つの方法のいずれかで行われます

  • 要素を使用するたびに、常に要素を再配置します。要素を特定してから使用するまでのわずかな時間内に要素が Stale になる可能性は低いですが、可能性はあります。欠点は、これが最も効率的なアプローチではないことです。特にリモート Grid で実行する場合はそうです。

  • ロケータを格納し、特定された Selenium 要素をキャッシュする別のオブジェクトで Web 要素をラップします。このラップされたオブジェクトでアクションを実行する場合、以前に特定されたキャッシュされたオブジェクトを使用しようとすることができます。そして、それが Stale である場合、例外をキャッチし、格納されたロケータで要素を再配置し、メソッドを再試行できます。これはより効率的ですが、ページが変更された後、使用しているロケータが別の要素(目的の要素ではない要素)を参照している場合に問題が発生する可能性があります。

コンテキストが変更された

要素オブジェクトは特定のコンテキストに対して格納されるため、別のコンテキスト(別のウィンドウや別のフレームまたは iframe など)に移動した場合、要素参照は引き続き有効ですが、一時的にアクセスできなくなります。このシナリオでは、現在のコンテキストに要素が存在しないため、要素を再配置しても役に立ちません。これを修正するには、要素を使用する前に必ず正しいコンテキストに戻るようにする必要があります。

ページが変更された

このシナリオは、コンテキストを変更しただけでなく、別のページに移動し、要素が特定されたコンテキストを破棄した場合です。現在のコンテキストから再配置することはできず、要素が有効なアクティブなコンテキストに戻ることもできません。これがエラーの原因である場合、正しい場所にナビゲートして再配置する必要があります。

ElementClickInterceptedException

この例外は、Selenium が要素をクリックしようとしたときに、クリックが代わりに別の要素によって受信される場合に発生します。Selenium が要素をクリックする前に、要素が表示されているか、他の要素に遮られていないか、有効になっているかを確認します。要素が遮られている場合、この例外が発生します。

考えられる原因

UI 要素のオーバーラップ

UI 上の要素は通常、互いに隣り合って配置されますが、要素がオーバーラップすることがあります。たとえば、ページをスクロールするときに常にウィンドウの上部に留まるナビゲーションバーなどです。そのナビゲーションバーがクリックしようとしている要素を覆っている場合、Selenium はそれを表示され有効になっていると認識する可能性がありますが、クリックしようとするとこの例外がスローされます。ポップアップやモーダルも、ここでの一般的な原因です。

アニメーション

アニメーションを含む要素も、この例外を引き起こす可能性があります。要素をクリックする前に、アニメーションが停止するのを待つことをお勧めします。

考えられる解決策

明示的な待機を使用する

明示的な待機は、このような場合に最適な方法となるでしょう。ExpectedCondition.ToBeClickable()WebDriverWait を使用して、適切な瞬間まで待機するのが良い方法です。

要素をビューにスクロールする

要素がビューの外にあるが、Selenium が要素をまだ表示されていると登録している場合(たとえば、ナビゲーションバーが画面上部のセクションにオーバーラップしている場合)、WebDriver.executeScript() メソッドを使用して JavaScript 関数を実行してスクロールできます(例:WebDriver.executeScript('window.scrollBy(0,-250)'))。または、Actions.moveToElement(element) で Actions クラスを利用することもできます。

InvalidSessionIdException

アクセスしようとしているセッションが、現在利用可能なセッションと異なる場合があります

考えられる原因

これは通常、セッションが削除された場合(例:driver.quit())、または最後のタブ/ブラウザが閉じられた場合(例:driver.close())など、セッションが変更された場合に発生します

考えられる解決策

スクリプトで driver.close() および driver.quit() のインスタンス、およびタブ/ブラウザが閉じる可能性のあるその他の原因を確認してください。要素を特定するのが早すぎる/早すぎる可能性があります。


ドライバの場所を特定できませんエラー

ドライバ実行可能ファイルへのパスが見つからない問題のトラブルシューティング。