top 10 selenium exceptions
例外処理フレームワークを使用したSeleniumWebDriver例外の処理– Seleniumチュートリアル#19
自動化コードで例外を取得することは非常に一般的です。 「例外」という言葉が示すように、これは特殊なケースまたはまれなケースです。
自動化コードの実行は、ネットワークの安定性の問題、インターネットの問題、サーバーの安定性など、実行に関連する多くの要因により、通常は期待どおりに実行されない場合があります。待機時間が不十分であるか、構文やパラメーターが正しくないために例外が発生する場合があります。
前回のWebDriverチュートリアルでは、次のような3種類の重要なWeb要素について学習しました。 Webテーブル、フレーム、動的要素 およびセレンスクリプトでのそれらの処理メカニズム
この中でフレームワークのチュートリアルを進める前に セレントレーニング シリーズ、このチュートリアルでは、 例外の種類と、JavaおよびSeleniumスクリプトでの例外の処理方法 。開発者/テスターは、例外処理フレームワークを使用して、Seleniumスクリプトの例外を処理します。
学習内容:
- 例外とは何ですか?
- 回避ハンドルアプローチの長所と短所
- JavaとSeleniumの例外の種類
- 例外処理
- SeleniumWebDriverの一般的な例外
- 一般的な例外の回避と処理
- #1)org.openqa.selenium.NoSuchElementException
- #2)org.openqa.selenium.NoSuchWindowException
- #3)org.openqa.selenium.NoSuchFrameException
- #4)org.openqa.selenium.NoAlertPresentException
- #5)org.openqa.selenium.InvalidSelectorException
- #6)org.openqa.selenium.ElementNotVisibleException
- #7)org.openqa.selenium.ElementNotSelectableException
- #8)org.openqa.selenium.TimeoutException
- #9)org.openqa.selenium.NoSuchSessionException
- #10)org.openqa.selenium.StaleElementReferenceException
- 結論
- 推奨読書
例外とは何ですか?
例外は、Javaプログラムが予期した出力を提供せずに突然終了するためのイベントです。 Javaは、ユーザーが例外を処理できるフレームワークを提供します。
例外を処理するプロセスは、例外処理と呼ばれます。
例外は、プログラムの通常の実行フローを妨げるため、処理する必要があります。例外処理の重要な目的の1つは、この中断を防ぎ、プログラムの実行を継続することです。特定の例外の発生時に一連のアクションを実行したい場合があります。
例外が発生すると、技術的には「」と呼ばれる例外オブジェクトが作成されます。 例外をスローする」 そして追加します 試して/キャッチ のようなブロック、
try { // Protected code } catch (ExceptionName e) { // Catch block }
#1) 例外をスローする可能性のあるコードが、Tryブロック内に追加されます。
#二) Catchステートメントは例外をキャッチし、それをパラメーターとして受け取ります。
#3) 例外がスローされない場合、catchステートメントではなくtryステートメントが実行されます。
例 :ロケーターが間違っているためにセレンスクリプトが失敗した場合、開発者は失敗の理由を理解できるはずです。これは、プログラムで例外が適切に処理されれば簡単に実現できます。
私の経験では、可能な限りWebDriverの例外を回避し、真に例外的なケースをキャッチするのが最善です。 try / catchを使用して、問題が発生し、自分で制御できないものを処理します。
私が他の人を捕まえることができるものを避けてください!
これは私のために働いた最高の戦略です。
例えば、 テストサーバーへのロードに通常よりも時間がかかるテストページについて考えてみます。このページでアクションを実行している間、頻繁に例外が発生します。だから、毎回これを捕まえるのではなく、
- 待機コマンドを追加して、例外を回避してみてください
- 本当に例外的なケースが発生した場合に備えて、「Try / Catch」を使用して処理します
これにより、例外の可能性が減少します。
回避ハンドルアプローチの長所と短所
利点 | 短所 |
---|---|
1)このアプローチにより、例外が発生する可能性が低くなります。 | 1)例外を回避するためにコードを追加するため、コードの行数が増えます |
それでも例外がキャッチされる場合2)チェックする価値のある本当に例外的なケースになります | 2)Web Driver API、コマンド、および例外についてよりよく理解している必要があります |
デバッグ時間を短縮します。自動化コードはバグを見つけることを目的としており、不要な3)例外をあまり多く見たくないので、それぞれの背後にある理由を見つけます | |
4)Catchブロックでは、より有効なケースを処理します | |
5)誤った失敗を減らす | |
6)より明確なレポート |
このチュートリアルでは、 回避と処理 SeleniumWebDriverで最も一般的な10の例外に対するアプローチ。その前に、例外処理とTry / Catchブロックの基本を理解しましょう。
JavaとSeleniumの例外の種類
以下では、例外の種類と、セレンスクリプトで例外処理フレームワークを使用するさまざまな方法について説明しました。
3種類の例外があります。
- チェックされた例外
- 未チェックの例外
- エラー
例外とエラーのクラス階層:
#1)チェックされた例外: チェックされた例外はコンパイル時に処理され、コンパイル時にキャッチおよび処理されない場合はコンパイルエラーが発生します。
例 : FileNotFoundException 、 IOException 等
#2)チェックされていない例外: チェックされていない例外の場合、コンパイラーは処理を義務付けません。コンパイラはコンパイル時に無視します。
例 : ArrayIndexoutOfBoundException
#3)間違い: シナリオが致命的であり、プログラムが回復できない場合、JVMはエラーをスローします。 try-catchブロックではエラーを処理できません。ユーザーがTrycatchブロックを使用してエラーを処理しようとしても、エラーから回復することはできません。
例 : アサーションエラー 、 OutOfMemoryError 等
例外処理
ブロックをキャッチしてみてください:
トライキャッチ ブロックは通常、例外を処理するために使用されます。例外のタイプは、来ると予想されるcatchブロックで宣言されます。 tryブロックで例外が発生すると、すぐに制御がcatchブロックに移動します。
例 :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); }
例外のタイプによっては、1つのtryブロックに複数のcatchブロックが存在する場合があります。
例 :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); } catch(FileNotFoundException file){ file.printStackTrace(); }
投げる 例外:
投げる Javaのキーワードは、例外を処理するのではなく、例外をスローするために使用されます。チェックされたすべての例外は、メソッドによってスローできます。
例 :
public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new FileReader('Data')); while ((line = br.readLine()) != null) { System.out.println(line); } }
最後に ブロック:
最後に 、ブロックはtry-catchブロックの実行に関係なく実行され、try / catchブロックが完了した直後に実行されます。
基本的にファイルクローズ、データベース接続などはfinallyブロックでクローズできます。
例 :
文法よりも優れた無料の文法チェッカー
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); } Finally { br.close(); }
上記の例では、 BufferReader ストリームはfinallyブロックで閉じられます。 br.close() tryおよびcatchブロックの実行に関係なく、常に実行されます。
注意 :最後に、ブロックはキャッチブロックなしで存在できます。常にキャッチブロックを用意する必要はありません。
多くのcatchブロックが存在する可能性がありますが、使用できるfinallyブロックは1つだけです。
スロー可能 :Throwableは、エラーと例外の親クラスです。一般に、Javaでエラーを処理することは困難です。プログラマーがエラーと例外のタイプについて確信が持てない場合は、エラーと例外の両方をキャッチできるThrowableクラスを使用することをお勧めします。
例 :
try { br = new BufferedReader(new FileReader('Data')); } catch (Throwable t) { t.printStackTrace(); }
SeleniumWebDriverの一般的な例外
セレンには独自の例外があります。セレンスクリプトを開発している間、プログラマーはそれらの例外を処理またはスローする必要があります。
以下は、セレンの例外のいくつかの例です。
Selenium WebDriverのすべてのランタイム例外クラスは、スーパークラスWebDriverExceptionに分類されます。
WebDriverExceptionには多くの例外クラスがありますが、一般的には以下のクラスがあります。
- NoSuchElementException
- NoSuchWindowException
- NoSuchFrameException
- NoAlertPresentException
- InvalidSelectorException
- ElementNotVisibleException
- ElementNotSelectableException
- TimeoutException
- NoSuchSessionException
- StaleElementReferenceException
詳細 :
ElementNotVisibleException :セレンが元素を見つけようとしたが、その元素がページ内に表示されない場合
NoAlertPresentException :ユーザーがアラートボックスを処理しようとしたが、アラートが存在しない場合。
NoSuchAttributeException :属性値を取得しようとしているが、その属性がDOMで使用できない場合。
NoSuchElementException :この例外は、ページで使用できない要素にアクセスするために発生します。
WebDriverException :コードがWebDriverを初期化できない場合、例外が発生します。
一般的な例外の回避と処理
上記の例外に対する回避と処理のアプローチについて説明しましょう。
#1)org.openqa.selenium.NoSuchElementException
このよく見られる例外クラスは、のサブクラスです。 NotFoundException クラス。例外は、WebDriverが要素を見つけて見つけることができない場合に発生します。
通常、これは、テスターがfindElement(By、by)メソッドに誤った要素ロケーターを書き込んだときに発生します。
以下の例では、テキストフィールドの正しいIDは「firstfield」でしたが、テスターが誤って「fistfield」と言っていたと考えてください。この場合、WebDriverは要素を見つけることができず、 org.openqa.selenium.NoSuchElementException スローされます
driver.findElement(By.id('submit')).click(); Exception Handling: try { driver.findElement(By.id('submit')).click(); } catch (NoSuchElementException e)
この場合、要素がロードされていなくても例外がスローされます。
回避と処理 :待機コマンドを実行してみてください。
例: 以下のwaitコマンドは、IDが「submit」のWeb要素が存在するまで10秒間待機します。次に、それをクリックしようとします。要素が使用可能であるにもかかわらずクリックが失敗した場合、例外がキャッチされます。
遅延時間を使用することは、テスト自動化の一般的な方法であり、ステップ間に一時停止を作成します。 Try / Catchを追加することで、待機が役に立たなかった場合でもプログラムが継続するようにします。
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.presenceOfElementLocated(By.id('submit'))); try { driver.findElement(By.id('submit')).click(); } catch (WebDriverException e) { System.out.println(“An exceptional case.”); } } catch (TimeOutException e) { System.out.println(“WebDriver couldn’t locate the element”); }
#2)org.openqa.selenium.NoSuchWindowException
NoSuchWindowException 下に来る NotFoundException クラス。これは、WebDriverが無効なウィンドウに切り替えようとしたときにスローされます。
以下のコードは、ウィンドウハンドルが存在しないか、切り替えることができない場合にorg.openqa.selenium.NoSuchWindowExceptionをスローする可能性があります。
driver.switchTo()。window(handle_1);
回避と処理 :ウィンドウハンドルを使用してアクティブなウィンドウのセットを取得し、同じウィンドウでアクションを実行します。
以下の例では、ウィンドウハンドルごとに、ドライバーの切り替えが実行されます。したがって、間違ったウィンドウパラメータを渡す可能性が減少しました。
for (String handle : driver.getWindowHandles()) { try { driver.switchTo().window(handle); } catch (NoSuchWindowException e) { System.out.println(“An exceptional case”); } }
#3)org.openqa.selenium.NoSuchFrameException
WebDriverが無効なフレームに切り替えようとすると、NotFoundExceptionクラスのNoSuchFrameExceptionがスローされます。
以下のコードは、フレーム「frame_11」が存在しないか利用できない場合、org.openqa.selenium.NoSuchFrameExceptionをスローする可能性があります。
driver.switchTo()。frame(“ frame_11”);
例外処理:
try { driver.switchTo().frame('frame_11'); } catch (NoSuchFrameException e)
この場合、フレームがロードされていなくても例外がスローされます。
最高のマルウェア除去ツールは何ですか
回避と処理 :待機コマンドを実行してみてください。
以下の例では、WebDriverはフレームが使用可能になるまで10秒間待機します。フレームが使用可能であり、それでも例外がある場合、フレームはキャッチされます。
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.frameToBeAvaliableAndSwitchToIt(frame_11)); try { driver.switchTo().frame('frame_11'); } catch (WebDriverException e) { System.out.println(“An exceptional case”); } } catch (TimeOutException e) { System.out.println(“WebDriver couldn’t locate the frame”); }
#4)org.openqa.selenium.NoAlertPresentException
NoAlertPresentException 下 NotFoundException WebDriverがアラートに切り替えようとするとスローされますが、これは使用できません。
org.openqa.selenium.NoAlertPresentException アラートがまだ画面に表示されていないときに、以下の自動化コードがAlert()クラスでaccept()操作を呼び出すと、スローされます。
driver.switchTo()。alert()。accept();
例外処理:
try { driver.switchTo().alert().accept(); } catch (NoSuchAlertException e)
この場合、アラートが完全にロードされていなくても例外がスローされます。
回避と処理 :アラートが予想されるすべての場合において、特定の時間は常に明示的または流暢な待機を使用してください。アラートが利用可能であり、それでも例外がある場合、アラートはキャッチされます。
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.alertIsPresent()); try { driver.switchTo().alert().accept(); } catch (NoAlertPresentException e) { System.out.println(“An exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver couldn’t locate the Alert”); }
#5)org.openqa.selenium.InvalidSelectorException
このサブクラスの NoSuchElementException クラスは、セレクターが正しくないか、構文的に無効な場合に発生します。この例外は、XPATHロケーターが使用されている場合によく発生します。
以下の例を考えてみましょう。
clickXPathButtonAndWait(“ // button [@ type = ’button’] [100]”);
XPATH構文が正しくないため、InvalidSelectorExeptionがスローされます。
回避と取り扱い :これを回避するには、ロケーターが正しくないか、構文が間違っている可能性があるため、使用されているロケーターを確認する必要があります。 Firebugを使用してxpathを見つけると、この例外を減らすことができます。
以下のコードは、Try / Catchを使用してそれを処理する方法を示しています
try { clickXPathButtonAndWait('//button[@type='button']'); } catch (InvalidSelectorException e) { }
#6)org.openqa.selenium.ElementNotVisibleException
ElementNotVisibleException クラスはのサブクラスです ElementNotInteractableException クラス。この例外は、WebDriverが対話できない非表示のWeb要素に対してアクションを実行しようとしたときにスローされます。つまり、Web要素は非表示の状態です。
例えば、 以下のコードで、IDが「送信」のボタンのタイプがHTMLで「非表示」の場合、 org.openqa.selenium.ElementNotVisibleException スローされます。
driver.findElement(By.id('submit')).click(); Exception Handling: try { driver.findElement(By.id('submit')).click(); } catch (ElementNotVisibleException e)
この場合、ページが完全にロードされていなくても例外がスローされます。
回避と処理 :これを行うには2つの方法があります。要素が完全に取得されるのを待つこともできます。
以下のコードは、要素を10秒間待機します。要素が表示されていても例外がスローされた場合、その要素はキャッチされます。
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.visibilityOfElementLocated(By.id(”submit”)); try { driver.findElement(By.id('submit')).click(); } catch (WebDriverException e) { System.out.println(“Exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver couldn’t find this element visible”); }
#7)org.openqa.selenium.ElementNotSelectableException
この例外は InvalidElementStateException クラス 。 ElementNotSelectableException Web要素がWebページに存在するが、選択できないことを示します。
例えば、 以下のコードは、ID「swift」が無効になっている場合にElementNotSelectableExceptionをスローする可能性があります。
選択ドロップダウン= new Select(driver.findElement(By.id(“ swift”)));
例外処理:
{を試してください
選択ドロップダウン= new Select(driver.findElement(By.id(“ swift”)));
} catch(ElementNotSelectableException e)
この場合、しばらくして要素が有効になっても例外がスローされます。
回避と処理 :要素がクリック可能になるまで待機する待機コマンドを追加できます。それでも例外がある場合は、キャッチされます。
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions. elementToBeClickable(By.id(”swift”)); try { Select dropdown = new Select(driver.findElement(By.id('swift'))); } catch (WebDriverException e) { System.out.println(“Exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver found that this element was not selectable.”); }
#8)org.openqa.selenium .TimeoutException
この例外は、コマンドの完了に待機時間がかかる場合に発生します。待機は主に、例外ElementNotVisibleExceptionを回避するためにWebDriverで使用されます。
プログラムの次のコマンドの前に、テストページが完全に読み込まれない場合があります。ページが完全に読み込まれる前にWebDriverがWebページ内の要素を見つけようとすると、例外ElementNotVisibleExceptionがスローされます。この例外を回避するために、待機コマンドが追加されています。
ただし、待機してもコンポーネントが読み込まれない場合は、例外 org.openqa.selenium .TimeoutException スローされます。
driver.manage()。timeouts()。implicitlyWait(10、TimeUnit.SECONDS);
driver.get(“ https://www.softwaretestinghelp.com”);
上記のプログラムでは、10秒の暗黙の待機が追加されています。ページの場合 www.softwaretestinghelp.com 10秒以内に読み込まれない場合、TimeoutExceptionがスローされます。
回避と取り扱い :これを回避するために、ページが読み込まれる平均時間を手動で確認し、待機時間を調整できます
または、ページが読み込まれるまでJavaScriptexecutorを使用して明示的な待機を追加することもできます。
以下の例では、JavaScriptエグゼキュータが使用されています。ページナビゲーションの後、「complete」が返されるまで、JavaScript returndocument.readyStateを20秒間呼び出します。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.until(webDriver -> ((JavascriptExecutor)webDriver).executeScript('return document.readyState').equals('complete')); driver.get('https://www.softwaretestinghelp.com');
#9)org.openqa.selenium.NoSuchSessionException
この例外は、WebDriver.quit()によってブラウザーを終了した後にメソッドが呼び出されたときにスローされます。これは、クラッシュやWebDriverがドライバーインスタンスを使用してコマンドを実行できないなどのWebブラウザーの問題が原因で発生することもあります。
経験豊富なj2ee面接の質問と回答
この例外を確認するには、以下のコードを実行できます。
driver.quit()
選択ドロップダウン= new Select(driver.findElement(By.id(“ swift”)));
回避と取り扱い :Selenium Webdriverテストケースを実行するには、常に最新の安定バージョンのブラウザーを選択してください。
この例外は、すべてのテストの完了時にdriver.quit()を使用することで減らすことができます。各テストケースの後にそれらを使用しようとしないでください。これにより、ドライバーインスタンスがnullであり、今後のテストケースで初期化せずに使用しようとすると問題が発生する可能性があります。
以下のコードは、@ BeforeSuite TestiNGアノテーションでWebDriverインスタンスを作成し、@ AfterSuiteTestiNGアノテーションで破棄します。
@BeforeSuite public void setUp() throws MalformedURLException { WebDriver driver = new FirefoxDriver(); } @AfterSuite public void testDown() { driver.quit(); }
#10)org.openqa.selenium.StaleElementReferenceException
この例外は、Web要素がWebページに存在しなくなったことを示します。
このエラーは、ElementNotVisibleExceptionと同じではありません。
StaleElementReferenceExceptionは、特定のWeb要素のオブジェクトがプログラムで問題なく作成された場合にスローされますが、この要素はウィンドウに表示されなくなります。これは、
- 別のページへのナビゲーション
- DOMが更新されました
- フレームまたはウィンドウスイッチ
WebElement firstName = driver.findElement(By.id( 'firstname'));
driver.switchTo()。window(Child_Window);
element.sendKeys( 'Aaron');
上記のコードでは、オブジェクトfirstNameが作成されてから、ウィンドウが切り替えられました。次に、WebDriverはフォームフィールドに「Aaron」と入力しようとします。この場合、StaleElementReferenceExceptionがスローされます。
回避と取り扱い :正しいウィンドウでアクションを実行しようとしていることを確認します。 DOMの更新による問題を回避するために、DynamicXpathを使用できます
別の例について説明しましょう。
ユーザー名フィールドの「id」が「username_1」であり、XPathが次のようになるとします。 // * [@ id = ’firstname_1?] 。ページをもう一度開くと、「id」が「 'ファーストネーム _11 ’。この場合、WebDriverが要素を見つけられなかったため、テストは失敗します。この場合、StaleElementReferenceExceptionがスローされます。
この場合、次のような動的xpathを使用できます。
try { driver.findElement(By.xpath(“//*[contains(@id,firstname’)]”)).sendKeys(“Aaron”); } catch (StaleElementReferenceException e)
上記の例では、動的XPATHが使用されており、それでも例外が見つかった場合は、キャッチされます。
結論
例外処理は、すべてのJavaプログラムとSeleniumスクリプトの重要な部分です。堅牢で最適なコードを構築するには、 スマートな方法で例外を処理する 。また、スクリプトで例外を処理することもベストプラクティスです。これにより、何らかの理由でプログラムが失敗した場合に、より適切なレポートが得られます。
ここでは、セレンスクリプトに実装する必要がある例外処理のプロセスとフレームワークについて説明しました。
例外を常に処理することは必須ではないことを忘れないでください トライキャッチ ブロック。スクリプトの要件に応じて、例外をスローすることもできます。
例外はプログラムの実行を妨げるため、無視しないでください。このチュートリアルでは、さまざまな例外と、手動のチェックとコードを介してそれらを取得する可能性を減らす方法について説明しました。
待機を追加すると、「NoSuchElementException」、「ElementNotFoundException」、「ElementNotVisibleException」などのいくつかのケースを制御できます。
次のチュートリアル#20 : 次のチュートリアルでは、 利用可能なさまざまなタイプのテストフレームワーク 。また、自動化テストで本格的なフレームワークアプローチを使用することの長所と短所についても学習します。テストデータ駆動型フレームワークについて詳しく説明します。
Selenium WebDriverでの例外処理に関連するクエリがある場合は、投稿してください。
推奨読書
- Javaの例外と例を使用した例外処理
- Selenium WebDriverでアラート/ポップアップを処理する方法-Seleniumチュートリアル#16
- AutoItチュートリアル-AutoItのダウンロード、インストール、基本的なAutoItスクリプト
- Cucumber Seleniumチュートリアル:Cucumber Java SeleniumWebDriverの統合
- SeleniumとJMeterの統合
- Selenium WebDriverの概要– Seleniumチュートリアル#8
- 30以上の最高のSeleniumチュートリアル:実際の例でSeleniumを学ぶ
- セレンの専門家のためのパートタイムのフリーランスの仕事の機会