量角器browser.wait不等待

时间:2015-01-06 16:50:04

标签: javascript angularjs testing protractor end-to-end

我假设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等待?或者我完全使用了错误的功能?我需要阻止的东西,直到我的浏览器到达下一次呼叫所需的位置。

3 个答案:

答案 0 :(得分: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');
    });
});

请参阅此处的用例:

答案 1 :(得分:2)

您需要使用browser.wait

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

答案 2 :(得分:1)

等待函数将保持该特定函数的执行,但JavaScript以异步方式工作。所以有时候在等待函数之前你的函数可能会被执行。 为了更好地理解它,你需要阅读角度/量角器中的Promise。

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

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