Protractor中的browser.wait没有等待

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来实现等待?或者我完全使用了错误的函数?我需要阻塞代码,直到浏览器完成前往下一个位置以供下一次调用使用。

3个回答

43

这个问题主要涉及到 Promise(事实上,每个 Protractor 问题都涉及到 Promise)。

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');
    });
});

这里可以看到使用案例:


7
这段内容的意思是,文档中的代码示例展示了一种阻塞等待的方式,但“返回”部分却警告这是一个Promise。其中的例子展示了如何使用driver.wait()方法来等待一个函数started执行完成,并在5秒内完成执行,如果超时则会返回错误信息"Server should start within 5 seconds"。最后再调用driver.get()方法来获取服务器URL。请参考以下链接:https://angular.github.io/protractor/#/api?view=webdriver.WebDriver.prototype.wait - atoth
1
@atoth - 我同意你的说法。你指出的示例代码是误导性的,因为它显示为阻塞式。也就是说,driver.get()函数实际上应该包装在已完成的Promise中。 - bob.mazzo

1

等待函数将暂停执行特定的函数,但是JavaScript以异步方式工作。因此有时您的函数在等待函数之前执行的可能性很大。 为了更好地理解它,您需要阅读关于Angular / Protractor中Promise的内容。

要使您的代码正常工作,您需要使用.then(function(){});(让第二个函数等待第一个函数完成)。

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

1

您需要使用await指示protractor暂停,直到browser.wait完成。

it('test case', async () => {
  await browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
  });
  console.log('2 - BeforeEach after wait');
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接