はじめに
すでにVSCode,WSL,Java,gradleの環境が整っている前提です。
もし、構築が整っていない方は、こちらのリンクを参考に整えるのをお勧めします。
なお、WSL上から直接Windowsのブラウザにアクセスできないので、Windows上にSelenium Serverを立てます。
SeleniumがWindows上のSelenium Serverにアクセスして自動テストを実行します。
Windows上にSelenium Serverを構築されていない方を以下の記事を参考に構築することができます。
自動テスト実行までの手順の流れは、こんな感じです。
gradleプロジェクト作成
↓
ロガー設定
↓
テストコード作成
↓
Selenium Server 起動
↓
自動テスト実行
gradleプロジェクトを作成する
projectタイプは「basic」、DSLは、「Groovy」を選択します。
$ 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
ファイル構成を確認する
$ ls
build.gradle gradle gradlew gradlew.bat settings.gradle
ソースコードの格納先を作成する
$ mkdir -p src/test/java/com/example
$ mkdir -p src/test/resources
build.gradleを編集する
ここにSeleniumを実行する上で必要なライブラリや設定をします。
e2etest/build.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を新規作成します。
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」の検索結果を表示します。
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を起動します。
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