等待sendKeys()的量角器

Protractor waiting for sendKeys()

本文关键字:量角器 sendKeys 等待      更新时间:2023-09-26

在使用AngularJS构建的web表单中,我试图在组合框中输入一些数据,然后按向下箭头键和enter键选择一个值。之后,我检查组合框的弹出窗口(这是一个剑道UI组合框)是否不再可见。

测试在Windows和Mac OS X上的Chrome中运行。在Windows上,以下代码运行良好:

comboInput.sendKeys('CAN')
    .sendKeys(protractor.Key.ENTER)
    .sendKeys(protractor.Key.ARROW_DOWN)
    .sendKeys(protractor.Key.ENTER);
expect(input.getAttribute('value')).toBe('id_3');
expect(popup.getAttribute('style')).toContain('display: none');

Protractor在组合框中输入"CAN",然后使用向下箭头键选择可见条目,然后使用Enter键确认选择,这也会取消组合框弹出窗口。

在OSX上,这是不起作用的,第二个期望总是失败,因为在评估期望之前,由于某种原因,没有触发关闭弹出窗口的Enter键事件。

我发现我必须将代码更改为以下内容才能使其工作:

comboInput.sendKeys('CAN')
    .sendKeys(protractor.Key.ENTER)
    .sendKeys(protractor.Key.ARROW_DOWN)
    .sendKeys(protractor.Key.ENTER).then(function() {
        expect(input.getAttribute('value')).toBe('id_3');
        expect(popup.getAttribute('style')).toContain('display: none');
    });

sendKeys返回一个承诺,如果我把期望放在那里,一切都会很好。

这样做正确吗?我在网上找到的例子都没有使用sendKeys上的then调用。

为什么第一个代码可以在Windows上运行,而不能在OS X上运行?我是不是错过了什么?有更好的方法吗?

编辑:这可能与OS X上本机键盘事件的处理有关吗?Protractor文档http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.sendKeys具有以下功能:

注意:在尚未支持本机键盘事件的浏览器上(例如OS X上的Firefox),将合成键事件。特殊的标点键将根据标准QWERTY en-us键盘布局进行合成。

由于sendKeys返回promise,因此它是异步的(正如您所知),并且在任何机器上都可能晚于预期发生。我强烈怀疑,如果你在Windows上运行1000次测试,出于同样的原因,它至少会失败几次。

我试图为这种情况找到一个"最佳实践",几乎已经老死了,我认为除了你已经在做的事情之外,没有其他的了。我的许多依赖于promise返回操作的Protractor测试最终都是包含匿名函数的then()语句的长字符串。请参阅链接:

如何在Protractor 中将行数或getText分配给变量

基本上,如果你不强迫Protractor按正确的顺序做事,那么十有八九会按错误的顺序发生。