我有一个e2e测试,该测试以应用程序的形式填写数据。我想使代码更高效,并且想知道是否值得。基本上,我的代码目前将密钥发送到所有必填字段,然后单击保存按钮。从那里,我检查数据是否正确显示,并显示成功消息。保存表单后的测试并不是我需要提高效率的。这是填写表格的过程。因此,我很想知道是否有人可以提供更实用的见解。我有点困惑,因为量角器使用了promise,所以对我的表单进行循环实际上不会起作用,因为元素将不可见。另外,我有一个电子邮件验证和下拉菜单,因此执行循环实际上并不会很好,因为有些字段需要特定格式。我当时正在考虑创建一个可以填写整个表单的函数,然后仅在测试中调用该函数,以使测试效率更高。我只是不确定这样做是否值得。任何建议都很好。我应该按原样保留代码吗?这是我填写表格的代码示例。谢谢!
page.getNameInput().sendKeys('test');
browser.sleep(1000);
page.getLastNameField().sendKeys('testLast');
browser.sleep(1000);
page.getEmailField().sendKeys('test@test')
//these are drop down menus
page.getProgramField().sendKeys(Key.RETURN);
page.getProgramField().sendKeys(Key.RETURN);
//2nd drop down
page.getFileField().sendKeys(Key.RETURN);
page.getFileField().sendKeys(Key.RETURN);
})
答案 0 :(得分:2)
因此,一般来说,使用browser.sleep()
是非常糟糕的,因为您实际上不知道操作完成的确切时间。这就是他们发明诺言的原因。
在您的特定情况下,一种选择是创建一个名为async fillInput(element, text)
的函数。该函数负责将数据填充到使用ElementFinder
创建的element(by.css('SOME_CSS_RULE'))
对象中。
export async function fillInput(el, text) {
await el.click()
await el.clear();
await el.sendKeys(text);
}
在该函数中,您可以看到await
的用法。实际上,它正在等待兑现承诺,并破坏其价值。这消除了无限嵌套promises
的痛苦。await
在每个异步函数中都可用。当您在单词async
之前加上一个函数时,它就是异步的。
在这种情况下,fillInput()
返回一个Promise<void>
对象,因为每个async
函数都返回一个Promise
。
将给定功能与await
结合使用,您可以在测试中执行以下操作:
// ...
var page;
t.beforeAll(function() {
page = getMyPage();
});
t.it('should be able to fill out form' , async function() {
await fillInput(page.getNameInput(), 'foo');
await fillInput(page.getLastNameField(), 'bar');
// ...
});