量角器,调用量角器后是否必须使用then()?

时间:2019-03-19 12:27:57

标签: promise protractor chaining method-chaining

可以写吗?

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

或者我应该写:

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

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

但是我发现带有.then的示例,而有些则没有。 量角器本身有一个不含.then()的示例: https://www.protractortest.org/#/control-flow

量角器是否具有自己的机制,并在另一个承诺之后解决一个问题,因此在返回Promise的量角器调用之后不需要使用.then()吗?

并且量角器的控制流仅在规范中有效吗? 在正常功能中使用.sendKeys()时,我必须使用.sendKeys().then(...)吗?

1 个答案:

答案 0 :(得分:1)

这全部取决于您是否使用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可以简单地理解为“等待,直到承诺解决为止”。它确实有点乏味,您感觉像在每行代码之前都写了await(基本上就是这样),但是我发现它比.then()树要好得多。