33

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

4

3 に答える 3

43

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

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

ユーザー提供の関数で定義されているように、条件が保持されるのを待機するようにコマンドをスケジュールします。待機の評価中にエラーが発生した場合は、伝播が許可されます。条件が webdriver.promise.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');
    });
});

ここで使用例を参照してください。

于 2015-01-06T19:01:35.100 に答える