失败:使用 ChromeDriver Chrome 和 Protractor 调用 sendKeys 到 ENTER 和其他击键时 sendKeysToActiveElement 错误

Failed: sendKeysToActiveElement error while invoking sendKeys to ENTER and other keystrokes using ChromeDriver Chrome with Protractor

在我自动更新到 Chrome 76 后,我今天使用 sendKeys 按下 Enter 或 Tab 的 Protractor 测试失败了。

昨天在 Chrome 75.

上找到了这个工作

这是曾经有效的代码:

browser.actions().sendKeys(protractor.Key.TAB).perform();

错误信息是

Failed: sendKeysToActiveElement 
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
    System info: host: 'DESKTOP-6JGLC4V', ip: '192.168.0.5', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_221'
    Driver info: driver.version: unknown

我们的 Angular 应用程序有下拉菜单,您必须在下拉菜单外单击或按 Tab 键将其关闭。所以我不会将击键发送到输入元素。我试过 $('body').sendKeys(protractor.Key.TAB); 但这似乎不起作用。

这个错误信息...

Failed: sendKeysToActiveElement 

...暗示 ChromeDriver 无法调用 sendKeys()ActiveElement

ChromeDriver / Chrome 切换到 [=48= 时,这个问题开始浮出水面]W3C支持。

@AutomatedTester 在讨论 UnsupportedOperationError: sendKeysToActiveElement with sendkeys 中提到,这可能是 Actions class 中 Client[= 中的问题58=] 绑定。

There should be a little shim in the bindings that make sure the same functionality is given on older commands that have been removed. This has been implemented in the core selenium binding.

  • Pythonexample:

    def send_keys(self, *keys_to_send):
    """
    Sends keys to current focused element.
    :Args:
     - keys_to_send: The keys to send.  Modifier keys constants can be found in the
       'Keys' class.
    """
    typing = keys_to_typing(keys_to_send)
    if self._driver.w3c:
        for key in typing:
        self.key_down(key)
        self.key_up(key)
    else:
        self._actions.append(lambda: self._driver.execute(
        Command.SEND_KEYS_TO_ACTIVE_ELEMENT, {'value': typing}))
    return self
    
    def send_keys_to_element(self, element, *keys_to_send):
    """
    Sends keys to an element.
    :Args:
     - element: The element to send keys.
     - keys_to_send: The keys to send.  Modifier keys constants can be found in the
       'Keys' class.
    """
    self.click(element)
    self.send_keys(*keys_to_send)
    return self
    

解决方案

@barancev 已经通过提交 Renaming back 'py' directory, use of 'legacy_create_init' argument 合并了所需的更改,这个问题将在 ChromeDriver v77.0[=58 的下一个版本中得到彻底解决=] / Chrome v77.0.

好消息是 Chrome驱动程序 v77.0 已经发布,其中包含以下修复。来自 Release Notes of ChromeDriver v77.0:

  • 已解决的问题 2975:按键(CONTROL、SHIFT 等)的 Webdriver 操作在 ChromeDriver 75.0.3770.8 [Pri-2]
  • 中不起作用
  • 已解决问题 2981:ChromeW3C 模式下的驱动程序在操作 API 调用 [Pri-2]
  • 之间丢失鼠标状态

结尾

Protractor.Key.Enter is not working in ChromeDriver v75.0.3770.8

已升级到 chromeDriver 77,但仍 运行 遇到与上述相同的问题。 await elem.sendKeys(protractor.Key.TAB); 也试过:await browser.actions().sendKeys(protractor.Key.TAB).perform();

`- Failed: sendKeysToActiveElement
  Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
  System info: host: 'GC02XYZ...', ip: 'fe80:xyz...', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.6', java.version: '11.0.1'
  Driver info: driver.version: unknown`

`chromeDriver -v
ChromeDriver 77.0.3865.40`

使用chrome74+时请在configuration.js文件

中添加以下内容
exports.config = {
    seleniumAddress : 'http://localhost:4444/wd/hub',
    specs: ['spec.js'],
    capabilities:{
        'browserName': 'chrome',
        'goog:chromeOptions': {
            w3c: false
        }
    }

};

备注: 参考这个 link https://github.com/angular/protractor/issues/5274#issuecomment-522258213