测试在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返回一个承诺,如果我把期望放在那里,一切正常.
这是正确的方法吗?我在网上找到的所有例子都没有使用sendKeys上的then调用.
为什么第一个代码适用于Windows而不适用于OS X?我错过了什么吗?有一个更好的方法吗?
编辑:这可能与OS X上本机键盘事件的处理有关吗? http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.sendKeys的Protractor文档具有以下内容:
Note: On browsers where native keyboard events are not yet supported (e.g. Firefox on OS X),key events will be synthesized. Special punctionation keys will be synthesized according to a standard QWERTY en-us keyboard layout.
解决方法
对于像这样的案件,我几乎已经老去试图找到一个“最佳实践”,除了你已经在做的事情之外我不认为有一个.我的许多依赖于promise返回操作的Protractor测试最终都是带有匿名函数的then()语句的长字符串.看到链接:
How to assign count of rows or getText to a variable in Protractor
基本上,如果你不强迫量角器以正确的顺序做事,那么十分之五会以错误的顺序发生.