首页 > 解决方案 > 我应该等待期望() 条件

问题描述

https://www.protractortest.org/#/async-await显示了在量角器中使用 async/await 的示例,但包括以下行:

    expect(await greeting.getText()).toEqual('Hello Julie!');

但我不明白这怎么可能是正确的:如果 greeting.getText() 是异步的(由 await 指示),那么直到该行完成后才能知道文本。不是:

    await expect(await greeting.getText()).toEqual('Hello Julie!');

因此,在继续之前,我们肯定会等待获得(并检查)文本。在这个例子中,它并不太重要(假设执行了期望检查),但一般来说,是否存在通过进一步操作重新排序 getText() 的风险(例如,这可能会将其从 DOM 中删除)。

如果它只是基于浏览器的异步操作,在实践中是否安全,因为它们无论如何都是串行执行的(所以 getText() 将在后续操作之前完成?

据推测,如果我们包含基于非浏览器的异步操作(例如,我们向服务器发出 http 请求),则无法保证排序,因此最佳实践是编写 'await expect(...).toX(. ..)'(即使期望表达式不是异步的也是安全的)。

当然,尽管如此,我们最终在几乎每一行的开头都有“等待”,这看起来有点难看。

标签: protractor

解决方案


引入await后量角器真的很简单,不需要再复杂了

首先在配置文件中禁用 selenium 控制流,只需在配置文件中添加这一行:

SELENIUM_PROMISE_MANAGER: false

https://www.protractortest.org/#/control-flow

现在在测试使用:

  it('should find an element by text input model', async function() {
    await browser.get('app/index.html#/form');

    var username =element(by.model('username'));
    await username.clear();
    await username.sendKeys('Jane Doe');

    var name = element(by.binding('username'));

    expect(await name.getText()).toEqual('Jane Doe');

  });

请注意,我没有使用等待

 var name = element(by.binding('username'));

这是因为在量角器中,除非您在其上调用方法,否则不会触发查找元素操作

所以你不必在那里使用 await

除非您在其上调用任何方法,否则您不会得到 element not found 。


推荐阅读