WSL上でVSCode+Selenium+gradle開発環境を構築する

# はじめに
すでにVSCode,WSL,Java,gradleの環境が整っている前提です。
もし、構築が整っていない方は、こちらのリンクを参考に整えるのをお勧めします。
- [ゼロからVSCode+WSL+Java+Gradle環境を構築する](https://qiita.com/sakamoto66/items/190af41913f751e785b7)

なお、WSL上から直接Windowsのブラウザにアクセスできないので、Windows上にSelenium Serverを立てます。
SeleniumがWindows上のSelenium Serverにアクセスして自動テストを実行します。
Windows上にSelenium Serverを構築されていない方を以下の記事を参考に構築することができます。
- [WindowsにSelenium Serverを立てる](https://qiita.com/sakamoto66/items/7c6e9a801c453a3cbeff)

自動テスト実行までの手順の流れは、こんな感じです。
gradleプロジェクト作成
　↓
ロガー設定
　↓
テストコード作成
　↓
Selenium Server 起動
　↓
自動テスト実行

# gradleプロジェクトを作成する
projectタイプは「basic」、DSLは、「Groovy」を選択します。

```bash
$ mkdir e2etest
$ cd e2etest
$ gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Project name (default: e2etest): 

> Task :init
Get more help with your project: https://guides.gradle.org/creating-new-gradle-builds

BUILD SUCCESSFUL in 33s
2 actionable tasks: 2 executed
```
# ファイル構成を確認する

```bash
$ ls
build.gradle  gradle  gradlew  gradlew.bat  settings.gradle
```

# ソースコードの格納先を作成する

```bash
$ mkdir -p src/test/java/com/example
$ mkdir -p src/test/resources
```
# build.gradleを編集する
ここにSeleniumを実行する上で必要なライブラリや設定をします。
e2etest/build.gradleを編集します。

```gradle
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * User Manual available at https://docs.gradle.org/6.6/userguide/tutorial_java_projects.html
 */
plugins {
    // Apply the java plugin to add support for Java
    id 'java'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
    mavenCentral()
}

dependencies {
    // Logger
    implementation 'org.slf4j:slf4j-log4j12:1.7.30'
    implementation 'ch.qos.logback:logback-classic:1.2.3'

    // Use JUnit Jupiter API for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.6.2'

    // Use JUnit Jupiter Engine for testing.
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'

    // Use Selenium for testing.
    testImplementation 'org.seleniumhq.selenium:selenium-java:3.141.59'

    // Use Selenide for Selenium
    testImplementation 'com.codeborne:selenide:5.13.1'
}

test {
    // Use junit platform for unit tests
    useJUnitPlatform()
    testLogging {
        events "standard_out", "standard_error"
    }
}
```
# ロガーを設定する
e2etest/src/test/resources/log4j.propertiesを新規作成します。

```ini
log4j.rootLogger=DEBUG, console
log4j.logger.xxx=DEBUG, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%p]:%c:%m%n
```

# テストコードを作成する
e2etest/src/test/java/com/example/SampleTest.javaを新規作成します。
「ホストOS」のところは任意のものに変更してください。
このコードは、chromeでgoogleにアクセスして「Hello Selenium」の検索結果を表示します。

```java
package com.example;

import static com.codeborne.selenide.Selenide.open;
import static com.codeborne.selenide.Selenide.sleep;
import static com.codeborne.selenide.Selenide.$;

import org.junit.jupiter.api.Test;

class SampleTest {
    @Test
    public void test() {
        System.setProperty("selenide.browser", "chrome");
        System.setProperty("selenide.remote", "http://ホストOS:4444/wd/hub");
        open("https://google.com");
        $("input[name='q']").val("Hello Selenium").submit();
        sleep(10000);
    }
}
```

# Selenium Server を立ち上げておく
VSCodeで新しいターミナル(Ctrl+Shift+@)を開き、Selenium Serverを起動します。

```bash
cmd.exe /c selenium-standalone.cmd start
```

# テストコードを実行する
もといたターミナル(bash)に戻り、テストコマンドを実行します。
しばらくすると、chromeが立ち上がり自動テストされることを確認できると思います。

```
$ ./gradlew clean test

> Task :test

com.example.SampleTest > test() STANDARD_ERROR
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/home/xxxx/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-log4j12/1.7.30/c21f55139d8141d2231214fb1feaf50a1edca95e/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/home/xxxx/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.3/7c4f3c474fb2c041d8028740440937705ebb473a/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

com.example.SampleTest > test() STANDARD_OUT
    2020-08-15 21:27:16,144 [DEBUG]:com.codeborne.selenide.impl.CiReportUrl:Variable selenide.reportsUrl not found
    2020-08-15 21:27:16,174 [INFO]:com.codeborne.selenide.impl.WebDriverThreadLocalContainer:No webdriver is bound to current thread: 11 - let's create a new webdriver
    2020-08-15 21:27:16,174 [DEBUG]:com.codeborne.selenide.webdriver.WebDriverFactory:browser=chrome
    2020-08-15 21:27:16,175 [DEBUG]:com.codeborne.selenide.webdriver.WebDriverFactory:browser.version=null
    2020-08-15 21:27:16,177 [DEBUG]:com.codeborne.selenide.webdriver.WebDriverFactory:remote=http://ホストOS:4444/wd/hub
    2020-08-15 21:27:16,177 [DEBUG]:com.codeborne.selenide.webdriver.WebDriverFactory:browserSize=1366x768
    2020-08-15 21:27:16,179 [DEBUG]:com.codeborne.selenide.webdriver.WebDriverFactory:startMaximized=false
    2020-08-15 21:27:16,223 [DEBUG]:com.codeborne.selenide.webdriver.ChromeDriverFactory:Using chrome preferences: {credentials_enable_service=false, plugins.always_open_pdf_externally=true}

com.example.SampleTest > test() STANDARD_ERROR
    Aug 15, 2020 9:27:26 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFO: Detected dialect: W3C

com.example.SampleTest > test() STANDARD_OUT
    2020-08-15 21:27:26,475 [INFO]:com.codeborne.selenide.webdriver.BrowserResizer:Set browser size to 1366x768
    2020-08-15 21:27:26,865 [INFO]:com.codeborne.selenide.webdriver.WebDriverFactory:BrowserName=chrome Version=84.0.4147.125 Platform=WINDOWS
    2020-08-15 21:27:26,866 [INFO]:com.codeborne.selenide.webdriver.WebDriverFactory:Selenide v. 5.13.1
    2020-08-15 21:27:26,866 [INFO]:com.codeborne.selenide.drivercommands.CreateDriverCommand:Create webdriver in current thread 11: RemoteWebDriver -> RemoteWebDriver: chrome on WINDOWS (58e1a16ecfd12bc15678d81c755bbd39)

BUILD SUCCESSFUL in 41s
4 actionable tasks: 4 executed
```