2016-06-14 11 views
2

browser.wait(...)で特定の要素が存在するかどうかを確認するために、element1.isPresent()であるかどうかを確認する試行錯誤的なE2Eテストを作成しようとしている場合は、それ以外は別の要素が存在するかどうかを確認したいelement2.isPresent()分度器の待機が不必要に失敗する

ちょうどelement1element2のうちの1つが存在する必要があります。両方が存在しない場合、テストは失敗します。

私のコードは次のようになります。私が期待する何

var element1 = element(by.id('test-elem1')); 
var element2 = element(by.id('test-elem2')); 
browser.wait(function() { 
    return element1.isPresent(); 
}, 5000, "Waiting for element 1").then(function() { 
    console.log('Found element 1'); 
    // Do something with element 1 
}, function() { 
    // Element 1 not present --> look for element 2 
    browser.wait(function() { 
     return element2.isPresent(); 
    }, 5000, "Waiting for element 2"); 
    print('Found element 2'); 
}); 

は次のとおりです。

  • element1が存在する場合、最初browser.waitが成功した約束で終了しますので、その.thenが行く必要があります第1の関数に入力し、Found element 1を印刷します。
  • ただし、element1が存在しない場合、最初のbrowser.waitは約束が失われて終了するので、.thenは2番目の関数に入り、element2を探します。次に、element2が存在する場合は、テストを続行し、Found element 2を印刷して、渡します。ただし、element2が存在しない場合は、この秒で失敗し、browser.waitとなり、テストは失敗します。

element1が存在しない場合、最初のbrowser.waitは失敗し、テストに失敗します。 element1が存在する場合、残りのテストは期待どおりに続行されます。

私は、.then()の2番目のパラメータが定義されている場合、失敗した場合、完全に失敗するのではなく、2番目の関数を呼び出す必要があるという印象を受けました。

私は、他の場所で作業していたコードがほぼ同じであることを確信しています(私はそれを削除して以来、もう参照できません)。なぜこの部分がうまくいかないのか分かりません。

どうしてですか?

答えて

3

私はちょうど期待条件を使用することになり、built-in or operatorがあります:

var EC = protractor.ExpectedConditions; 
var element1 = element(by.id('test-elem1')); 
var element2 = element(by.id('test-elem2')); 

browser.wait(EC.or(EC.presenceOf(element1), EC.presenceOf(element2)), 5000); 

両方の要素が存在しないと、そうでない渡す場合、これは失敗します。


ここで、最初のコードで何が起こっているのかを理解しようとします。

最初の問題は、browser.wait()の最初の引数が関数であることです。おっと、ああ

var element1 = element(by.id('test-elem1')); 
var element2 = element(by.id('test-elem2')); 

browser.wait(function() { 
    return element1.isPresent(); 
}, 5000).then(function() { 
    console.log('Found element 1'); 
}, function() { 
    // Element 1 not present --> look for element 2 
    browser.wait(function() { 
     return element2.isPresent(); 
    }, 5000).then(function() { 
     print('Found element 2'); 
    } 
}); 
+0

:また、あなたは、第二browser.wait()コールのthen()コールバックに二console.log()の呼び出しを配置する必要があります。最初に実際に文字列を取得したラッパーを使用していたので、最初の引数は 'browser.wait'に文字列として残しました。私は質問を書くときにそれを削除するのを忘れてしまった。 – Jashaszun

+0

また、「element1」か「element2」のどちらを見つけるかによって、私は別のことをする必要があります。私はまだそれのための期待条件を使用すべきですか? – Jashaszun

+0

@Jashaszunまあ、待っても使えますが、さらにisPresent()チェックを発行します。あるいは、あなたは現在のアプローチに固執することができます(それが今働いていると仮定します)。btw、あなたは 'EC.presenceOf'呼び出しで関数を置き換えることができます。ありがとう。 – alecxe

関連する問題