【发布时间】:2015-01-30 07:16:29
【问题描述】:
在使用 AngularJS 构建的 Web 表单中,我尝试在组合框中输入一些数据,然后按向下箭头键和 Enter 键选择一个值。之后,我正在检查组合框的弹出窗口(它是一个 Kendo 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 键确认选择,这也会关闭组合框弹出窗口。
在 OS X 上,这不起作用,第二个期望总是失败,因为在出于某种原因评估期望之前没有触发用于关闭弹出窗口的 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 返回一个承诺,如果我把期望放在那里,一切正常。
这是正确的方法吗?我在网上找到的所有示例都没有使用then 调用sendKeys。
为什么第一个代码可以在 Windows 而不是 OS X 上运行?我错过了什么吗?有没有更好的方法来做到这一点?
编辑:这可能与在 OS X 上处理本机键盘事件有关吗? http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.sendKeys 的 Protractor 文档有以下内容:
注意:在尚不支持原生键盘事件的浏览器上(例如 OS X 上的 Firefox),按键事件将被合成。特殊标点键将根据标准 QWERTY en-us 键盘布局合成。
【问题讨论】:
-
好问题!我没有答案,但建议您,如果使用 Jasmine,将
sendKeys部分与expect部分分开,分别放在其自己的it()块中,然后使用该技术避免。 -
另外结帐问题#690 以获取有关 OSX sendKeys 问题的一些链接。
-
但这不会破坏目的吗?对我来说,每个测试(在“它”中描述)都包含操作(在这种情况下为
sendKeys)和验证(expect)。将它们分成单独的测试会破坏该链接。 -
好点。然而,在尝试在 Jasmine 规范中做不止一件事情时,使用 Protractor 对我来说效果很好的事情的实际方面导致了不稳定的测试。
标签: javascript angularjs protractor