2015-01-06 4 views
25

私はbrowser.waitがブロッキングコールであるはずですが、期待通りに動作していないと仮定しています。ここに私のサンプルです:私はbrowser.waitが実際に阻止されたと仮定するので、今分度器browser.waitは実際には待機しません。

describe("browser.wait", function() { 
    beforeEach(function() { 
     browser.wait(function() { 
      console.log('1 - BeforeEach WAIT'); 
      return true; 
     }); 
    console.log('2 - BeforeEach after wait'); 
}); 

afterEach(function() { 
    browser.wait(function() { 
     console.log('4 - afterEach WAIT'); 
     return true; 
    }); 
    console.log('5 - afterEach after wait'); 
}); 

it('should probably actually wait.', function() { 
    console.log('3 - IT statement'); 
    expect(1).toBe(1);  
}); 

、私は私にconsole.logの呼び出しが順番に実行されるだろうと思いました。 1,2,3,4,5;

私が手に実際の出力は次のようになります。

2 - BeforeEach after wait 
1 - BeforeEach WAIT 
3 - IT statement 
5 - afterEach after wait 
4 - afterEach WAIT 

は、どのように私は実際に待ってbrowser.wait得ることができますか?あるいは間違った関数を完全に使っていますか?私はブラウザが次の呼び出しのために必要な場所に到達するまでブロックする必要があります。

答えて

35

これはすべて約束です(実際にすべての分度器の質問は約束です)。

スケジュールコマンドを 一部のユーザー定義関数で定義されているように、保持するための条件を待つために:

browser.wait()は、条件を待つことスケジュールコマンド、ブロッキング呼び出しではありません。 の評価中にエラーが発生した場合、それらは伝播することが許可されます。 がwebdriver.promise.Promiseを返す場合、ポーリングループは が解決されるのを待って、 条件が満たされているかどうかを評価するために解決された値を使用します。約束の解決時間は、待ち時間がタイムアウトしたかどうかを考慮して、 です。

これは、すぐに渡す関数を呼び出すことはなく、コマンドをスケジュールして、約束が解決されるのを待つ(内部の関数が約束を返す場合)。

あなたは、このケースでは、正しい順序を持っているthen()を使用することができます。

beforeEach(function() { 
    browser.wait(function() { 
     console.log('1 - BeforeEach WAIT'); 
     return true; 
    }).then(function() { 
     console.log('2 - BeforeEach after wait'); 
    }); 
}); 

は、ここでの使用例を参照してください:

+5

このことについて素敵な事 'Returns'セクションは、これは' Promise'であることを警告しながら、ドキュメント内のコード例では、待機をブロックとしてこれを示していること。 参照:https://angular.github.io/protractor/#/api?view=webdriver.WebDriver.prototype.wait doc: 'var started = startTestServer(); driver.wait(started、 5 * 1000、 'サーバーは5秒以内に起動する'); driver.get(getServerUrl()); ' – atoth

+0

@atoth - ステートメントに同意します。あなたが指摘したサンプルコードは誤解を招きます。すなわち、 'driver.get()'関数は、実際に実現された約束の中に実際にラップされるべきです。 –

1

ウェイト機能は、そのための実行を開催します特定の関数ですが、JavaScriptは非同期で動作します。だからいつかあなたの関数がwait関数の前に実行される可能性があります。 これをよく理解するには、角度/分度器の約束を読む必要があります。

コードを機能させるには、.then(function(){});を実行する必要があります。 (第1回完了するまで待つように機能2を尋ねる。

browser.wait(function() { 
    console.log('1 - BeforeEach WAIT'); 
    return true; 
}).then(function() { 
    console.log('2 - BeforeEach after wait'); 
}); 
関連する問題