量角器等待sendKeys()

时间:2014-10-09 07:20:21

标签: javascript angularjs protractor

在使用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');

量角器进入" 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处的量角器文档具有以下内容:

  

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

1 个答案:

答案 0 :(得分:6)

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

对于像这样的案件,我几乎已经老去试图找到一个“最佳实践”,除了你已经在做的事情之外,我认为没有一个。我的许多依赖于promise返回操作的Protractor测试最终都是具有匿名函数的then()语句的长字符串。见链接:

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

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