Вчера я обновил свой 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
.
Есть ли у вас какие-либо идеи, что вызывает эту ошибку или как ее исправить?
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
Кажется, что-то изменилось в новой версии 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])
У меня такая же проблема. Я решил это для 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]);
Похожие вопросы
Связанные вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.