2016-05-17 14 views
0

アプリケーションワークフローの1つには、10ページ以上のページがあります。WebDriverがこの要素またはその要素が見つかるまで待ちます

「次へ」ボタンを続けてクリックする必要があります。新しいコンテンツを再読み込みするAJAX呼び出しが行われ、「次へ」ボタンも再読み込みされます。 移動するページ数は、常に10ではありません。10〜100の範囲で設定できます。

「testcomplete」というIDのWeb要素が見つかるたびに、テストが完了します。

だから、現在、私は(ExpectedConditionsを使用)

WebDriverWait wait = new WebDriverWait(driver, 30);

//Keep clicking next 
while(isNextPresent()){ 
     NextButton.click(); 
} 

//testcomplete reached here 
System.out.println("test complete"); 




private boolean isNextPresent(){ 
    try{ 
     WebElement element = wait.until(ExpectedConditions.visibilityOf(NextButton)); 
     return true; 
    }catch(Exception e){ 
     // 
    } 
    return false; 
} 

現在、私のコードは正常に動作します。しかし、私はそれを改善しようとしています。 idが 'testcomplete'の要素が存在する場合、30秒間の不必要な待機が嫌いです。その時間 'NextButton'は存在しないためです。

isNextPresentの機能を改善するにはどうすればよいですか?つまり、30秒間待つのではなく、「testcomplete」があると即座にfalseに戻りますか?

注:分度器にも同様の要件があるため、分度器も付けました。

+0

「30秒の不必要な待機」とはどういう意味ですか?この関数は、 'visibilityOf'がtrueを返した後すぐに実行されません。最大タイムアウトは30秒ですか? – Gunderson

+0

@Gunderson、私が言及したように、それは正常に動作します。しかし、結局、ある時点で、次のボタンはそこにはありません。代わりにtestcompleteという別の要素があります。その時、それは30秒待つ。 – KitKarson

答えて

1

両方の要素の条件を組み合わせて、 'visibilityOf(myElement)'に対して最初に真を返すという事実に応じてアクションを実行できます。たぶん、擬似でこのような何か(周りに申し訳ありませんが、IDE):

loop(i < 30){ 
     // wait NextBtn for 1 sec, if true click and break 
     // wait TestCopmlete for 1 sec 
} 
+0

私の質問は異なっています。もう一度お読みください! – KitKarson

+0

今私は参照してください。あなたの機能は何をすべきかを実行しています。 IMHOでは、他の要素のDOMもポーリングするためにもう1つ使用する必要があります。可能な解決策は、ループ内の両方のチェックをラップし、1秒ごとに各条件をチェックすることです。 – ekostadinov

+0

はい、ありがとうございます。これを行う簡単な方法があれば私はちょうど興味があった。 – KitKarson

1

利用EC.or()、ラ:

その後
wait.until(ExpectedConditions.or(
    ExpectedConditions.visibilityOf(NextButton), 
    ExpectedConditions.visibilityOf(element(by.id('testcomplete'))) 
)); 

これは、バックexpect所望の状態になった後

expect(NextButton.isDisplayed()).toBeTruthy(); 
関連する問題