なんでメアドが入らんの…
先日chromeが98.0.4758.80に更新され、私の環境でも更新が入ったのですが、それ以降Capybaraを使ったテスト環境で変なエラーが続出したので対処メモを残します。
こんな方向け
- プログラミング初学者
- Railsユーザーでテスト環境でなぜかログインに失敗する方
- とりあえず応急処置したい!という方
環境
- Ruby : ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin20]
- Rails : 6.0.0
- rspec-rails : 4.0.2
- capybara : 3.36.0
- selenium-webdriver (4.1.0)
- webdrivers (5.0.0)
エラーの内容
Rspecを使用した結合テストを実施中。
ログイン画面にていつも通りFakerで作成したアドレスをfill_in
メソッドを用いて入力させようとした
すると以下のようなエラーが…
Failure/Error: fill_in 'session_email', with: user.email
Selenium::WebDriver::Error::UnknownError:
unknown error: Cannot construct KeyEvent from non-typeable key
(Session info: chrome=98.0.4758.80)
[Screenshot]: /Users/host.mac/hoge/app/fuga/tmp/screenshots/failures_r_spec_example_groups_nested_nested_hogehogeができる_XXX.png
# 0 chromedriver 0x00000001047e23c9 chromedriver + 5018569
# 1 chromedriver 0x000000010476d333 chromedriver + 4539187
# 2 chromedriver 0x0000000104342a88 chromedriver + 170632
# 3 chromedriver 0x000000010437f04b chromedriver + 417867
# 4 chromedriver 0x00000001043a1f7f chromedriver + 561023
# 5 chromedriver 0x0000000104371823 chromedriver + 362531
# 6 chromedriver 0x0000000104370e7b chromedriver + 360059
# 7 chromedriver 0x00000001043947e2 chromedriver + 505826
# 8 chromedriver 0x000000010436bde5 chromedriver + 339429
# 9 chromedriver 0x00000001043948ee chromedriver + 506094
# 10 chromedriver 0x00000001043a7604 chromedriver + 583172
# 11 chromedriver 0x00000001043946d3 chromedriver + 505555
# 12 chromedriver 0x000000010436a95e chromedriver + 334174
# 13 chromedriver 0x000000010436b935 chromedriver + 338229
# 14 chromedriver 0x000000010479e1ee chromedriver + 4739566
# 15 chromedriver 0x00000001047b7f51 chromedriver + 4845393
# 16 chromedriver 0x00000001047bd928 chromedriver + 4868392
# 17 chromedriver 0x00000001047b8a7a chromedriver + 4848250
# 18 chromedriver 0x0000000104792c31 chromedriver + 4693041
# 19 chromedriver 0x00000001047d3978 chromedriver + 4958584
# 20 chromedriver 0x00000001047d3b01 chromedriver + 4958977
# 21 chromedriver 0x00000001047e9795 chromedriver + 5048213
# 22 libsystem_pthread.dylib 0x00007fff203168fc _pthread_start + 224
# 23 libsystem_pthread.dylib 0x00007fff20312443 thread_start + 15
# ./spec/support/sign_in_support.rb:7:in `sign_in'
# ./spec/system/reviews_spec.rb:63:in `block (3 levels) in <top (required)>'
見慣れないエラーが。
Selenium::WebDriver::Error::UnknownError:
unknown error: Cannot construct KeyEvent from non-typeable key
(Session info: chrome=98.0.4758.80)
というわけで検索してみたところstackoverflowでも同じようなスレッドを発見したため確認しました。どうもchromeのアップデートに伴う仕様みたいで、過去のアップデートでも似たような件があったそうです。
Selenium-chromedriver: Cannot construct KeyEvent from non-typeable key (stack overflow)
[🐛 Bug]: Send_keys does not accept underscore when I use chromedriver 98 (GitHub)
どうやらchromedriverのバージョン98(98.0.4758.80
と98.0.4758.48
のどちらも)では入力できない文字があるみたいでして、今回は運悪く「@」が該当になるみたいです。確認されているのは[]{}@<>
とのこと(githubのコメより)
というわけでこれらのスレッドやissueを参考に手っ取り早い解決方法を導入しました。
ずばり、前バージョンを使う
以上です。
お好みのテスト環境にこれを書き加えてください
私はRspecを使っているので…↓
require 'webdrivers/chromedriver'
Webdrivers::Chromedriver.required_version = '97.0.4692.71'
とりあえずこれで解決しました。記述場所はわかりませんでしたので、ひとまずネストなしです。
chromedriverの履歴を見るとchrome99の記載もありますが、こちらはまだβ版であるため、ひとまずは前バージョンの97を導入する方が確実かと思います。
リンク先の記事にはfill_in
メソッドを上書きするという方法も紹介されていましたが、とりあえず応急処置でいいやと思ったので割愛します。
他にこんな方法があるよ!という方はよろしければご教授ください!