【问题标题】:Protractor waiting for sendKeys()量角器等待 sendKeys()
【发布时间】: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


【解决方案1】:

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

我几乎因年老而死,试图为此类案例寻找“最佳实践”,除了您已经在做的事情之外,我认为没有其他方法。我的许多依赖于返回承诺操作的量角器测试最终都是带有匿名函数的then() 语句的长字符串。见链接:

How to assign count of rows or getText to a variable in Protractor

基本上,如果你不强制 Protractor 以正确的顺序做事,那么十分之五的事情会以错误的顺序发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2017-08-27
    • 2020-06-04
    相关资源
    最近更新 更多