量角器等待sendKeys()

nwi*_*ler 7 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');
Run Code Online (Sandbox Code Playgroud)

量角器将"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');
    });
Run Code Online (Sandbox Code Playgroud)

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键盘布局进行合成.

Isa*_*man 6

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

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

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

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