可以写:
getFieldX().clear().sendKeys('abc');
或者我应该写:
getFieldX().clear().then( () => sendKeys('abc));
我对量角器中的Promise处理感到困惑。 clear()
返回一个承诺,所以我之后应该使用.then()
,不是吗?
但我找到了.then和一些没有的例子。量角器本身有一个没有.then()
的例子:https://www.protractortest.org/#/control-flow
Protractor是否有自己的机制并且一个接一个地做出决定,所以在一个返回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
简单地可以被解读为“等到承诺决定继续前进”。它确实有点乏味,你觉得你在每行代码(你基本上做)之前写await
,但我发现它明显优于.then()
树。