Spring Boot + npm + Geb で入力フォームを作ってテストする ( その84 )( WebDriver を最新バージョンに上げる )
概要
記事一覧はこちらです。
何回かに分けて boot-npm-geb-sample プロジェクトのモジュールやツールを 2020/05 時点の最新バージョンにします。IntelliJ IDEA は 2020.1.1、JDK は AdoptOpenJDK 11.0.7+10.2 を使用します。
- 今回の手順で確認できるのは以下の内容です。
- WebDriver を最新バージョンに上げて動作するようにします。
参照したサイト・書籍
目次
- WebDriver のバージョンを最新にする
- build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する
- Selenium と Geb を最新バージョンにする
- 結局テストが成功するようになったのは sleep(500) でした。。。
- gebTest タスク実行時に
WARNING: An illegal reflective access operation has occurred
が出ているのを解消する
手順
WebDriver のバージョンを最新にする
動作確認をする前に Chrome と Firefox のWebDriver を最新バージョンにします。Chrome の WebDriver は https://chromedriver.chromium.org/ を見ると Current stable release は 81.0.4044.69、Firefox の WebDriver は https://github.com/mozilla/geckodriver/releases を見ると 0.26.0 でした。
build.gradle の以下の点を変更します。
webdriverBinaries { chromedriver "81.0.4044.69" geckodriver "0.26.0" }
chromedriver "73.0.3683.68"
→chromedriver "81.0.4044.69"
に変更します。geckodriver "0.24.0"
→geckodriver "0.26.0"
に変更します。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
また chromedriver、geckodriver の exe もダウンロードして D:\chromedriver\81.0.4044.69
、D:\geckodriver\0.26.0
の下に配置した後、src/test/resources/GebConfig.groovy の以下の点を変更します。
//System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.24.0/geckodriver.bat") //System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe") driver = { ..........
D:/geckodriver/0.24.0/geckodriver.bat
→D:/geckodriver/0.26.0/geckodriver.bat
に変更します。D:/chromedriver/73.0.3683.68/chromedriver.exe
→D:/chromedriver/81.0.4044.69/chromedriver.exe
に変更します。
build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する
clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと compileTestGroovy タスクで警告のメッセージが出ますが、BUILD SUCCESSFUL のメッセージが表示されます。Spring Boot + npm + Geb で入力フォームを作ってテストする ( その83 )( Checkstyle を 8.11 → 8.19 へ、PMD を 6.6.0 → 6.13.0 へバージョンアップ+JUnit 5 の導入+ Oracle JDK 8u202 → AdoptOpenJDK 11.0.2+9 へ、error-prone を 2.3.1 → 2.3.3 へバージョンアップする) と同じ状況ですので、これは OK。
Web アプリを起動してから gebTest タスクを実行してみると、こちらも BUILD SUCCESSFUL のメッセージが表示されました。
次は IDEA から Geb のテストを実行してみます。src/test/resources/GebConfig.groovy の上に記述している WebDriver のパスの設定のコメントを解除してから、
System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.26.0/geckodriver.bat") System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe") driver = { ChromeOptions chromeOptions = new ChromeOptions() new ChromeDriver(chromeOptions) // FirefoxOptions firefoxOptions = new FirefoxOptions() // new FirefoxDriver(firefoxOptions) }
src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy を開いてテストを実行します。
Chrome は一部のテストが失敗しました。動きを見ていると画面遷移時にカーソルが正しい入力項目に移動しないように見えます。Headless モードでは成功するのに。。。
Firefox に切り替えてテストを実行すると、
System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.26.0/geckodriver.bat") System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe") driver = { // ChromeOptions chromeOptions = new ChromeOptions() // new ChromeDriver(chromeOptions) FirefoxOptions firefoxOptions = new FirefoxOptions() new FirefoxDriver(firefoxOptions) }
こちらはすべてのテストが成功しました。
Selenium と Geb を最新バージョンにする
Headless モードでない Chrome でテストが失敗する原因が分からないため、Selenium と Geb を最新バージョンにしてみます。
build.gradle の dependencies block の以下の点を変更します。
dependencies { .......... def seleniumVersion = "3.141.59" .......... .......... // for Geb + Spock testImplementation("org.gebish:geb-spock:3.4") { exclude group: "org.codehaus.groovy", module: "groovy-all" } testImplementation("org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-support:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-api:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}") .......... }
def seleniumVersion = "3.13.0"
→def seleniumVersion = "3.141.59"
に変更します。testImplementation("org.gebish:geb-spock:2.3.1")
→testImplementation("org.gebish:geb-spock:3.4")
に変更します。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
起動している Web アプリを停止してから build し直した後、再度 Web アプリを起動します。
src/test/resources/GebConfig.groovy の設定を Chrome に切り替えてから src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy のテストを実行してみましたが、状況は変わりませんでした。。。
結局テストが成功するようになったのは sleep(500) でした。。。
Web で検索してみたところ以下のページを見つけて document.readyState や jQuery.active の状態を見るようにしてみましたが、状況は変わりません。
- Selenium WebDriver: Wait for complex page with JavaScript to load
https://intellipaat.com/community/5115/selenium-webdriver-wait-for-complex-page-with-javascript-to-load
結局いろいろ試してみた結果、テストが成功するようになったのは form.btnXxxx.click(...) の後に sleep(500)
を追加した場合でした。src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy を以下のように変更します(全てのテストを同様に変更します)。
def "入力画面1に入力後、入力画面2へ遷移→入力画面1へ戻ると入力した値が表示される"() { given: "入力画面1を表示する" to InquiryInput01Page when: "最大文字数の文字を入力して次へボタンをクリックする" form.setValueList(maxLengthValueList) form.btnNext.click(InquiryInput02Page) sleep(500) then: "入力画面2へ遷移し初期値が表示されている" form.assertValueList(initialValueList) and: "戻るボタンをクリックする" form.btnBack.click(InquiryInput01Page) sleep(500) then: "入力した最大文字数の文字が入力されている" form.assertValueList(maxLengthValueList) }
もっと適切な修正方法があるとは思うのですが、さっぱり分かりませんでした。。。
gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred
が出ているのを解消する
Selenium と Geb を最新バージョンにしたら gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred
が出るようになっていましたので、出ないようにします。
to method
が出力されている行(例えば WARNING: Illegal reflective access by ... to method java.util.function.Predicate....
)のパッケージ名を見て build.gradle の以下の点を変更します。
// JDK 11 に変更後、test タスク実行時に groovy と powermock が JDKの内部部分にアクセスするためにコードでリフレクションを使用 // していて WARNING が出るため、JVM の起動時オプションの --add-opens を指定して WARNING が出ないようにする def jvmArgsAddOpens = [ "--add-opens=java.base/java.io=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED", "--add-opens=java.base/java.lang.ref=ALL-UNNAMED", "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED", "--add-opens=java.base/java.math=ALL-UNNAMED", "--add-opens=java.base/java.net=ALL-UNNAMED", "--add-opens=java.base/java.nio.charset=ALL-UNNAMED", "--add-opens=java.base/java.security=ALL-UNNAMED", "--add-opens=java.base/java.time=ALL-UNNAMED", "--add-opens=java.base/java.util=ALL-UNNAMED", "--add-opens=java.base/java.util.function=ALL-UNNAMED", "--add-opens=java.base/java.util.regex=ALL-UNNAMED", "--add-opens=java.base/java.util.stream=ALL-UNNAMED", "--add-opens=java.desktop/java.beans=ALL-UNNAMED" ] ..........
- jvmArgsAddOpens に以下のオプションを追加します。
"--add-opens=java.base/java.math=ALL-UNNAMED"
"--add-opens=java.base/java.time=ALL-UNNAMED"
"--add-opens=java.base/java.util.function=ALL-UNNAMED"
gebTest タスクを実行して WARNING: An illegal reflective access operation has occurred
が出なくなったことを確認します。
履歴
2020/05/06
初版発行。