失败:使用 ChromeDriver Chrome 和量角器调用 sendKeys 到 ENTER 和其他击键时出现 sendKeysToActiveElement 错误

Jos*_*djo 5 selenium google-chrome selenium-chromedriver selenium-webdriver protractor

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

这是昨天在 Chrome 75 上找到的。

这是曾经工作的代码:

browser.actions().sendKeys(protractor.Key.TAB).perform();
Run Code Online (Sandbox Code Playgroud)

错误信息是

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
Run Code Online (Sandbox Code Playgroud)

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

Deb*_*anB 3

这个错误信息...

Failed: sendKeysToActiveElement 
Run Code Online (Sandbox Code Playgroud)

...意味着ChromeDriver无法调用sendKeys()ActiveElement 。

当ChromeDriver / Chrome切换到W3C支持时,这个问题开始出现。

@AutomatedTester 在讨论UnsupportedOperationError: sendKeysToActiveElement with sendkeys中提到,这可能是客户端绑定中的Actions类中的问题。

绑定中应该有一些垫片,以确保在已删除的旧命令上提供相同的功能。这已在核心 selenium 绑定中实现。

  • Python 示例:

    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
    
    Run Code Online (Sandbox Code Playgroud)

解决方案

@barancev 已经通过提交重命名回 'py' 目录、使用 'legacy_create_init' 参数合并了所需的更改,并且此问题将在ChromeDriver v77.0 / Chrome v77.0的下一版本中得到完全解决。

好消息是ChromeDriver v77.0已经发布,包含以下修复。来自ChromeDriver v77.0 的发行说明

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

尾奏

Protractor.Key.Enter 在 ChromeDriver v75.0.3770.8 中不起作用