私はJavaでWebDriverを使用してテストスイートを作成しています。重要なのは、テストは機能テストであり、単体テストではありません。多くの場合、同じテストケースが異なるデータで順番に数回実行されます。たとえば、アプリケーションごとに異なる名前とコンポーネントを持つ「アプリケーションの作成」などがあります。Java、WebDriver、アサート/例外、およびUIの状態
テストケースのexecutonパスにはいくつかのダイアログが含まれています。各ダイアログで、エラーが発生することがあります(たとえば、「コンポーネントが見つかりません」)。現在、私のコードはすぐ隣、彼らが起こる場所にエラーを処理する - 例えば:(これは、生産コードの一部簡略化した例はありませんが、それはテストされていなかったので、些細なミスはご容赦ください)
WebElement component;
try {
component = componentsDialog.findElement(By.xpath("@class='component' and @componentId = '" + componentId + "']"));
} catch (NoSuchElementException nse) {
log.error("Component not found");
driver.switchTo().activeElement().sendKeys(Keys.ESCAPE);
stoppedOnError = true;
return;
}
component.click();
WebElement buttonAdd =
componentsDialog.findElement(By.className("addbutton"));
buttonAdd.click();
これは、エラー処理のためのJavaほどではありません。私が将来使用することを選択した場合、TestNGに統合するのは難しいかもしれません。
しかし、これをテストケースの一般的なNoSuchElementExceptionハンドラに任せることはできません。ほとんどの場合、NoSuchElementExceptionは、UIが変更された(またはテストコードで間違いを起こした)ことを意味します。この場合、テストケースのこのインスタンスの特定の構成が間違っていることを意味します。その設定はユーザーによって設定されます。これは異なるエラーであり、異なる方法で報告する必要があります。
私は例外をキャッチし、正しいメッセージで別のものを生成することができます...しかし、エスケープキーが押された部分に注意してください。コンポーネントの選択ダイアログが閉じるので、コンポーネントの選択が成功した場合と同じUIの状態になります。このテストケースの残りの部分では、この特定のダイアログは開いていません。では、例外ハンドラ(テストケースメソッドの最後または呼び出し元)は、UIが現在どの状態にあるのか、そしてそれを回復するために何をする必要があるのかを知っていますか?
(すべての可能なダイアログに固有の要素の存在を検出することに依存しているため、自動検出は可能ですが不安定です。
ここで、即時実行ストリームの外でエラー処理を有効にするにはどうしたらよいですか?状態のトラッキング変数をどこかに保持しますか?これはひどく間違っているようです。
もちろん、ページオブジェクトモデルに切り替えることができます。このモデルでは、非常に重量のあるものとして私を襲ってきました。コードの行数を最大1桁まで増やす必要があり、多くの多様なテストケースが同じコントロールを使用している場合にのみ恩恵を受けます。 (典型的には私のケースでは、異なるユースケースでは異なるUI要素が使用されるため、モデルがどのように効果を上げるのか分かりません)。
おそらく、この印象は間違いです。しかし、たとえモデルを使用しても、すべてのページは無関係のオブジェクトです。実際にどのページが実際にアクティブだったのかはどのようにわかりますか?別のページがアクティブなときにページのメソッドを呼び出すと、(検出ロジックが複雑な場合に)意味のない例外が発生します。
findElementメソッドをfindElementsに変更してください – Grasshopper
私の場合と同じように動作するようにするには、最後の行をelseブロックに移動する必要があります。私の例ではreturn文に注意してください。 –
実際には、Addボタンをクリックしてもテストケースは終了しません。テストケースのようないくつかのチェックがあるので、私はそれのかなりの部分をインデントした最後の部分で終わるでしょう。私はそれを避けるためにreturn文を使用します。 –