量角器 browser.wait 不等待

Protractor browser.wait doesn't 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 等待?还是我完全使用了错误的功能?在我的浏览器到达下一次调用所需的位置之前,我需要阻止一些事情。

都是关于承诺的(实际上每个量角器问题都是关于承诺的)。

browser.wait() 不是阻塞调用,它调度命令 等待条件:

Schedules a command to wait for a condition to hold, as defined by some user supplied function. If any errors occur while evaluating the wait, they will be allowed to propagate. In the event a condition returns a webdriver.promise.Promise, the polling loop will wait for it to be resolved and use the resolved value for evaluating whether the condition has been satisfied. The resolution time for a promise is factored into whether a wait has timed out.

它不会立即调用您传入的函数,它会安排一个命令并等待 promise 被解析(如果 returns 中的函数是一个 promise)。

在这种情况下,您可以使用 then() 来获得正确的顺序:

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

在此处查看用例:

  • How can I wait for a condition?

等待函数将暂停执行该特定函数,但 JavaScript 以异步方式工作。所以有时你的函数可能会在等待函数之前被执行。 要更好地理解它,您需要阅读 angular/protractor 中的 Promises。

为了让您的代码正常工作,您需要 .then(function(){}); (要求功能 2 等到第一个完成。

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

您需要使用await

指示量角器暂停直到browser.wait完成
it('test case', async () => {
  await browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
  });
  console.log('2 - BeforeEach after wait');
});