2017-04-23 7 views
0

私は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要素が使用されるため、モデルがどのように効果を上げるのか分かりません)。

おそらく、この印象は間違いです。しかし、たとえモデルを使用しても、すべてのページは無関係のオブジェクトです。実際にどのページが実際にアクティブだったのかはどのようにわかりますか?別のページがアクティブなときにページのメソッドを呼び出すと、(検出ロジックが複雑な場合に)意味のない例外が発生します。

答えて

0

このコードを書く場合、私はこのように書くでしょう。

List<WebElement> component = componentsDialog.findElements(By.xpath("@class='component' and @componentId = '" + componentId + "']")); 
if (component.isEmpty()) 
{ 
    log.error("Component not found"); 
    driver.switchTo().activeElement().sendKeys(Keys.ESCAPE); 
    componentsDialog.findElement(By.className("addbutton")).click(); 
} 
else 
{ 
    component.get(0).click(); 
} 

ここで例外をスローする必要はありません。あなたはthe docsを見れば、それは

findElementは、使用findElements(によって)非存在の要素を探して、代わりに長さがゼロの応答をアサートするために使用すべきではありません述べています。

ああ...そしてページオブジェクトについてのあなたのコメントに。それは多くの余分なコードを必要とすべきではありません。それが実現するのは、組織の改善、コードの再利用の改善、メンテナンスの負担の軽減などです。ページやダイアログのコードをすべて1つのクラスにまとめると、状況が変わったときやバグを修正する必要があるときにスクリプトを更新するのがずっと簡単になります。メンテナンスの労力が大幅に削減されます。

+0

findElementメソッドをfindElementsに変更してください – Grasshopper

+0

私の場合と同じように動作するようにするには、最後の行をelseブロックに移動する必要があります。私の例ではreturn文に注意してください。 –

+0

実際には、Addボタンをクリックしてもテストケースは終了しません。テストケースのようないくつかのチェックがあるので、私はそれのかなりの部分をインデントした最後の部分で終わるでしょう。私はそれを避けるためにreturn文を使用します。 –

関連する問題