web-dev-qa-db-ja.com

分度器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);      
});

今、browser.waitが実際にブロックしていると仮定したため、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を待機させるにはどうすればよいですか?または、間違った機能を完全に使用していますか?ブラウザが次の呼び出しに必要な場所に到達するまでブロックするものが必要です。

31
Justin

それはすべて約束に関するものです(実際、すべての分度器の質問は約束に関するものです)。

browser.wait() はブロッキングコールではなく、コマンドをスケジュールする条件を待機します。

ユーザーが提供する機能で定義されているように、条件が保持されるのを待つコマンドをスケジュールします。待機の評価中にエラーが発生した場合、エラーの伝播が許可されます。条件がwebdriver.promise.Promiseを返す場合、ポーリングループはそれが解決されるまで待機し、解決された値を使用して条件が満たされているかどうかを評価します。約束の解決時間は、待機がタイムアウトしたかどうかに考慮されます。

渡す関数をすぐには呼び出さず、コマンドをスケジュールし、promiseが解決されるのを待ちます(内部の関数がpromiseを返す場合)。

この場合、then()を使用して正しい順序にすることができます。

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

こちらのユースケースをご覧ください。

40
alecxe

待機関数はその特定の関数の実行を保留しますが、JavaScriptは非同期に動作します。そのため、関数がwait関数の前に実行される可能性があります。よりよく理解するには、角度/分度器の約束を読む必要があります。

コードを機能させるには、.then(function(){});が必要です。 (機能2に最初の完了まで待機するように要求します。

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