Вчера я обновил свой Chrome и Chromedriver до последней версии, и с тех пор я получаю следующие сообщения об ошибках при запуске функций Cucumber:

....
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 есть проблемы, особенно с символами @ и \. Любой другой символ можно без проблем вписать в текстовое поле.

Код, вызывающий ошибку, выглядит так

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, капибара 3.35.3

Ошибка возникает только для объектов с тегом @javascript.

Есть ли у вас какие-либо идеи, что вызывает эту ошибку или как ее исправить?

5
tecpaladin 3 Фев 2022 в 10:18
Здесь та же ошибка
 – 
Gabriel Anglada
3 Фев 2022 в 10:56

3 ответа

На данный момент проще всего закрепить более раннюю версию драйвера Chrome, поэтому добавьте его в верхнюю часть вашего капибары.

# /test/support/system/capybara_config.rb
require 'webdrivers/chromedriver'
Webdrivers::Chromedriver.required_version = '97.0.4692.71'

Я также играл с переопределением метода fill_in.

Это далеко не идеально и на самом деле зависит от ОС, поэтому, пожалуйста, предоставьте лучшее решение или обновите этот ответ. Я постараюсь обновлять по мере продвижения моего исследования.


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
1
Roland Studer 3 Фев 2022 в 13:59

Кажется, что-то изменилось в новой версии ChromeDriver, и больше нельзя отправлять некоторые специальные символы напрямую с помощью метода send_keys.

В этой ссылке вы увидите, как это решается (на С#) --> Selenium - SendKeys("@") написать "à"

Что касается реализации Python, проверьте это --> https://www. geeksforgeeks.org/special-keys-in-selenium-python/

В частности, моя реализация была (с использованием MAC):

driver.find_element('.email-input', 'user@mail.com')

Теперь мне пришлось изменить его на:

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])
0
Gabriel Anglada 3 Фев 2022 в 11:25
Большое спасибо за этот ввод, я добавил ответ, который на самом деле работает с рубином в системных тестах, но это не может быть решением, поскольку оно зависит от раскладки ОС / клавиатуры…
 – 
Roland Studer
3 Фев 2022 в 12:24

У меня такая же проблема. Я решил это для Selenium java, например:

 String arroba = Keys.chord(Keys.ALT, "2");

 String[] mailSplit = mail.split("@");

 userInput.sendKeys(mailSplit[0]);

 userInput.sendKeys(arroba);
 userInput.sendKeys(Keys.BACK_SPACE);

 userInput.sendKeys(mailSplit[1]);
0
abarragancosto 3 Фев 2022 в 14:16