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)。

在这种情况下,您可以使用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 回答
1

等待函数将保持该特定函数的执行,但 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');
});
于 2017-11-02T07:53:41.470 回答
1

您需要browser.wait通过使用指示量角器暂停直到完成await

it('test case', async () => {
  await browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
  });
  console.log('2 - BeforeEach after wait');
});
于 2021-02-09T23:25:18.260 回答