量角器browser.wait不等待

Jus*_*tin 31 javascript testing end-to-end angularjs protractor

我假设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);      
});
Run Code Online (Sandbox Code Playgroud)

现在,因为我认为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  
Run Code Online (Sandbox Code Playgroud)

我如何让browser.wait等待?或者我完全使用了错误的功能?我需要阻止的东西,直到我的浏览器到达下一个呼叫所需的位置.

ale*_*cxe 40

这完全是关于承诺(实际上每个量角器问题都是关于承诺的).

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');
    });
});
Run Code Online (Sandbox Code Playgroud)

请参阅此处的用例:

  • 关于这一点的可爱之处在于doc中的代码示例将其显示为阻塞等待,而`Returns`部分则警告您这是一个`Promise`.请参阅:https://angular.github.io/protractor/#/api?view=webdriver.WebDriver.prototype.wait doc中的示例:`var started = startTestServer(); driver.wait(已启动,5*1000,'服务器应在5秒内启动'); driver.get(getServerUrl());` (7认同)