首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Selenium-chromedriver:无法从不可键入的键构造KeyEvent

Selenium-chromedriver:无法从不可键入的键构造KeyEvent
EN

Stack Overflow用户
提问于 2022-02-03 07:18:54
回答 11查看 7.7K关注 0票数 29

昨天,我将Chrome和Chromedriver更新为最新版本,然后在运行Cucumber特性时收到以下错误消息:

代码语言:javascript
复制
....
unknown error: Cannot construct KeyEvent from non-typeable key
        (Session info: chrome=98.0.4758.80) (Selenium::WebDriver::Error::UnknownError)
      #0 0x55e9ce6a4093 <unknown>
      #1 0x55e9ce16a648 <unknown>
      #2 0x55e9ce1a9866 <unknown>
      #3 0x55e9ce1cbd29 <unknown>
      .....

我尝试用Capybara的fill_in方法填充文本字段。在调试过程中,我注意到Capybara存在问题,特别是在符号@\方面。所有其他字符都可以写入文本字段,没有任何问题。

触发错误的代码如下所示

代码语言:javascript
复制
def sign_in(user)
  visit new_sign_in_path
  fill_in 'Email', with: user.email
  fill_in 'Password', with: user.password
  click_button 'Sign in'
end

user.email包含一个类似于"example1@mail.com"的字符串。

我使用Rails 6.1.3.1,Cucumber 5.3.0,Chromedriver 98.0.4758.48,capybara 3.35.3

此错误仅发生在使用@javascript标记的功能上。

您知道是什么导致了这个错误,或者如何修复它吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2022-02-03 09:23:43

现在,最简单的方法是将引脚添加到较早版本的chrome驱动程序中,因此将其添加到capybara配置中。

红宝石

代码语言:javascript
复制
# /test/support/system/capybara_config.rb
require 'webdrivers/chromedriver'
Webdrivers::Chromedriver.required_version = '97.0.4692.71'

希望这个问题在将来的色度驱动程序版本中得到解决,它有被提出来并在这里讨论

我也尝试过重写fill_in方法。

这不是理想的,实际上操作系统依赖,所以请提供更好的解决方案或更新此答案。我将努力更新我的研究进展。

代码语言:javascript
复制
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase

  # overriding the `fill_in` helper for filling in strings with an `@` symbol
  def fill_in(locator = nil, with:, currently_with: nil, fill_options: {}, **find_options)
    return super unless with.include? "@"

    find_options[:with] = currently_with if currently_with
    find_options[:allow_self] = true if locator.nil?
    element = find(:fillable_field, locator, **find_options)
    email_front, email_back = with.split("@")

    element.send_keys(email_front)
    page.driver.browser.action
        .key_down(Selenium::WebDriver::Keys[:alt])
        .send_keys('g')
        .key_up(Selenium::WebDriver::Keys[:alt])
        .perform
    element.send_keys(email_back)
  end
end
票数 13
EN

Stack Overflow用户

发布于 2022-02-03 08:25:39

ChromeDriver的新版本似乎发生了一些变化,不再可能使用send_keys方法直接发送一些特殊的字符。

在这个链接中,您将看到它是如何解决的(在C#中)-> Selenium - SendKeys("@")写一个"à“

关于python实现,请检查这个-> https://www.geeksforgeeks.org/special-keys-in-selenium-python/

具体来说,我的实现是(使用MAC):

代码语言:javascript
复制
driver.find_element('.email-input', 'user@mail.com')

现在我不得不把它改为:

代码语言:javascript
复制
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

emailParts = 'user@mail.com'.split('@')
emailElement = driver.find_element('.email-input')

emailElement.send_keys(emailParts[0])
action = ActionChains(driver)
action.key_down(Keys.ALT).send_keys('2').key_up(Keys.ALT).perform()
emailElement.send_keys(emailParts[1])
票数 4
EN

Stack Overflow用户

发布于 2022-02-04 10:35:19

我在Python中也遇到了同样的问题,似乎只使用ActionChains就可以轻松地解决这个问题。

代码语言:javascript
复制
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

def safe_send_keys(
    driver,
    input_selector: str,
    input_text: str,
    selector_type = By.CSS_SELECTOR
):
    driver.find_element(selector_type, input_selector).click()
    action = ActionChains(driver)
    action.send_keys(input_text)
    action.perform()

# Example
driver = webdriver.Chrome()
# ... Go to your web page
email = "email_with_at@email.com"
selector = "input_selector"
safe_send_keys(driver, selector, email)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70967207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档