【Rails6】ログインできない！テスト(Rspec4)でchromedriverが98になってから困ったこと【メモ】

# なんでメアドが入らんの…

先日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`メソッドを用いて入力させようとした

すると以下のようなエラーが…

```:terminal
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)](https://stackoverflow.com/questions/70967207/selenium-chromedriver-cannot-construct-keyevent-from-non-typeable-key)


[[🐛 Bug]: Send_keys does not accept underscore when I use chromedriver 98 (GitHub)](https://github.com/SeleniumHQ/selenium/issues/10318)

どうやらchromedriverのバージョン98（`98.0.4758.80`と`98.0.4758.48`のどちらも）では入力できない文字があるみたいでして、今回は運悪く「@」が該当になるみたいです。確認されているのは`[]{}@<>`とのこと（githubのコメより）

というわけでこれらのスレッドやissueを参考に手っ取り早い解決方法を導入しました。

## ずばり、前バージョンを使う

以上です。
お好みのテスト環境にこれを書き加えてください
私はRspecを使っているので…↓

```ruby:spec/rails_helper.rb

require 'webdrivers/chromedriver'
Webdrivers::Chromedriver.required_version = '97.0.4692.71'
```

とりあえずこれで解決しました。記述場所はわかりませんでしたので、ひとまずネストなしです。

[chromedriverの履歴](https://chromedriver.chromium.org/downloads)を見るとchrome99の記載もありますが、こちらはまだβ版であるため、ひとまずは前バージョンの97を導入する方が確実かと思います。

リンク先の記事には`fill_in`メソッドを上書きするという方法も紹介されていましたが、とりあえず応急処置でいいやと思ったので割愛します。

他にこんな方法があるよ！という方はよろしければご教授ください！

## 参考記事一覧

- [Rspecの設定はrails_helper.rbにだけ書けばよい](https://qiita.com/kazutosato/items/8255a685206b327ad151)
- [Selenium-chromedriver: Cannot construct KeyEvent from non-typeable key (stack overflow)](https://stackoverflow.com/questions/70967207/selenium-chromedriver-cannot-construct-keyevent-from-non-typeable-key)
- [[🐛 Bug]: Send_keys does not accept underscore when I use chromedriver 98 (GitHub)](https://github.com/SeleniumHQ/selenium/issues/10318)
- [ChromeDriver - Downloads](https://chromedriver.chromium.org/downloads)