かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その84 )( WebDriver を最新バージョンに上げる )

概要

記事一覧はこちらです。

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 へバージョンアップする ) の続きです。

何回かに分けて boot-npm-geb-sample プロジェクトのモジュールやツールを 2020/05 時点の最新バージョンにします。IntelliJ IDEA は 2020.1.1、JDK は AdoptOpenJDK 11.0.7+10.2 を使用します。

  • 今回の手順で確認できるのは以下の内容です。
    • WebDriver を最新バージョンに上げて動作するようにします。

参照したサイト・書籍

目次

  1. WebDriver のバージョンを最新にする
  2. build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する
  3. Selenium と Geb を最新バージョンにする
  4. 結局テストが成功するようになったのは sleep(500) でした。。。
  5. gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred が出ているのを解消する

手順

WebDriver のバージョンを最新にする

動作確認をする前に ChromeFirefox の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.69D:\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.batD:/geckodriver/0.26.0/geckodriver.bat に変更します。
  • D:/chromedriver/73.0.3683.68/chromedriver.exeD:/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。

f:id:ksby:20200505235710p:plain

Web アプリを起動してから gebTest タスクを実行してみると、こちらも BUILD SUCCESSFUL のメッセージが表示されました。

f:id:ksby:20200506002007p:plain

次は 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 を開いてテストを実行します。

f:id:ksby:20200506002752p:plain

Chrome は一部のテストが失敗しました。動きを見ていると画面遷移時にカーソルが正しい入力項目に移動しないように見えます。Headless モードでは成功するのに。。。

f:id:ksby:20200506002532p:plain

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)
}

こちらはすべてのテストが成功しました。

f:id:ksby:20200506003410p:plain

SeleniumGeb を最新バージョンにする

Headless モードでない Chrome でテストが失敗する原因が分からないため、SeleniumGeb を最新バージョンにしてみます。

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 のテストを実行してみましたが、状況は変わりませんでした。。。

f:id:ksby:20200506010034p:plain

結局テストが成功するようになったのは sleep(500) でした。。。

Web で検索してみたところ以下のページを見つけて document.readyState や jQuery.active の状態を見るようにしてみましたが、状況は変わりません。

結局いろいろ試してみた結果、テストが成功するようになったのは 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)
    }

f:id:ksby:20200506011724p:plain

もっと適切な修正方法があるとは思うのですが、さっぱり分かりませんでした。。。

gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred が出ているのを解消する

SeleniumGeb を最新バージョンにしたら gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred が出るようになっていましたので、出ないようにします。

f:id:ksby:20200506094635p:plain

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 が出なくなったことを確認します。

f:id:ksby:20200506095507p:plain

履歴

2020/05/06
初版発行。