量角器,我必须在量角器调用后使用 then() 吗?

Protractor, do I have to use then() after protractor calls?

可以这样写吗:

getFieldX().clear().sendKeys('abc');

或者我应该写:

getFieldX().clear().then( () => sendKeys('abc));

我对量角器中的 Promise 处理感到非常困惑。 clear() returns 一个承诺,所以我应该在之后使用 .then(),不是吗?

但我找到了带有 .then 和一些不带 .then 的示例。 量角器本身有一个没有 .then() 的例子: https://www.protractortest.org/#/control-flow

Protractor 是否有自己的机制并一个接一个地解决 promise,因此不需要在 protractor 调用 returns Promise 后使用 .then()

量角器的控制流是否只在一个规范中有效? 在正常功能中使用 .sendKeys() 时,我必须使用 .sendKeys().then(...) ?

这完全取决于您是否使用 SELENIUM_PROMISE_MANAGER。由于这是(已经?)被弃用,我不会使用它。默认情况下应将其设置为 false,但如果您想确保可以将 SELENIUM_PROMISE_MANAGER = false; 添加到您的 conf 文件中。量角器移动的方式是使用 async/await,因此您的 sendKeys 函数看起来像:

let field = element(by.css('CSS.Selector'));
await field.clear();
await field.sendKeys('abc');

因为这些是异步函数,您需要正确定义函数,所以基本规范如下:

describe('Demonstrating async/await',function(){
  it('Should send some keys', async function(){
    let field = element(by.css('CSS.Selector'));
    await field.clear();
    await field.sendKeys('abc');
  });
});

重要的区别在于函数需要定义为 async function()。就阅读代码而言,await 可以简单地读作 "Wait until promise resolved to move on"。它确实有点乏味,你觉得你在每一行代码之前都写了 await(你基本上是这样做的),但我发现它比 .then() 树好得多。