KotlinのSelenideを使用してブラウザを操作する

2023年6月5日

Selenideとは

Selenideは、Selenium WebDriverを利用したテスト自動化のためのフレームワークです。(公式を翻訳しただけ)

早速書いてみる

プロジェクトの作成

今回はgradleのプロジェクトで作成するので、以下のコマンドでgradleプロジェクトを作成します。

$ gradle init --type=kotlin-application

Google Chromedriverのインストール

chromedriverをインストールします。

$ brew tap homebrew/cask
$ brew cask install chromedriver

正常にインストールされたのかの確認のため、以下のコマンドを実行します。

$ chromedriver --version

実行してみると以下のような画面が表示されます。Googleから取ってきているから、大丈夫なはずなんですけどね・・・

とりあえず「システム環境設定」→「セキュリティとプライバシー」を開きます。一般のタブを選択して「chromedriverは開発元が確認できないため、使用がブロックされました」とあるので、横の「このまま許可」をクリックします。

再度コマンドを実行すると、ダイアログが表示されるので「開く」をクリックします。

すると以下のようにバージョンが表示されるはずです。

$ chromedriver --version                                                                                                           ✘ 137
ChromeDriver 81.0.4044.138 (8c6c7ba89cc9453625af54f11fd83179e23450fa-refs/branch-heads/4044@{#999})

gradle ファイルにライブラリの設定を追加

「build.gradle」にselenideのライブラリ情報を追加します。

dependencies {
 ・・・
    implementation("com.codeborne:selenide:5.11.1")
}

実行してみる

「App.kt」を以下のようにして実行してみます。

/*
 * This Kotlin source file was generated by the Gradle 'init' task.
 */
package selenide.sample

import com.codeborne.selenide.Configuration
import com.codeborne.selenide.WebDriverRunner
import com.codeborne.selenide.Selenide.*
import org.openqa.selenium.By
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions

fun main(args: Array<String>) {
    Configuration.browser = WebDriverRunner.CHROME
    System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver")

    val chromeOptions = ChromeOptions()
    # ウィンドウサイズを最大にしたい場合はつける
    chromeOptions.addArguments("--start-maximized")
    # Dockerで使う場合はつける
    chromeOptions.addArguments("--disable-dev-shm-usage")
    # ヘッドレスモードで起動する場合はつける
    chromeOptions.addArguments("--headless)
    val driver = ChromeDriver(chromeOptions)
    WebDriverRunner.setWebDriver(driver)

    open("https://google.com")
    `$`(By.name("q")).setValue("上田晋也").pressEnter()
    val ret = `$$`("#res .g")
    print(ret.get(0).text())
}

以下のコマンドを実行します。

 $ gradle run
ウェブ検索結果

上田晋也 - Wikipedia
ja.wikipedia.org › wiki › 上田晋也
上田 晋也(うえだ しんや、1970年(昭和45年)5月7日 - )は日本のお笑いタレント、司会者、キャスター、俳優。お笑いコンビ・くりぃむしちゅーのツッコミ担当。相方は有田哲平。 熊本県熊本市南区出身。プライムを経て、ナチュラルエイト所属。身長172cm、 ...
最終学歴: 熊本県立済々黌高等学校卒業 コンビ名: くりぃむしちゅー
相方: 有田哲平 事務所: プライム→ナチュラルエイト
上田晋也のサタデージャーナル · 有田哲平 · Category:上田晋也 · サッカー選手
コンソールに出力されているのと同じで先頭にWikiが表示されているのがわかります

jarファイルを出力して、実行する

jarファイルを出力する

gradle プロジェクトでjarファイルを生成するには以下のコマンドを実行します。

$ gradle build

「build/libs/~.jar」に出力されています。

jarファイルを実行します

コマンドラインで出力したjarファイルを実行します。

$ java -jar ./build/libs/selenide-sample.jar
ウェブ検索結果

上田晋也 - Wikipedia
ja.wikipedia.org › wiki › 上田晋也
上田 晋也(うえだ しんや、1970年(昭和45年)5月7日 - )は日本のお笑いタレント、司会者、キャスター、俳優。お笑いコンビ・くりぃむしちゅーのツッコミ担当。相方は有田哲平。 熊本県熊本市南区出身。プライムを経て、ナチュラルエイト所属。身長172cm、 ...
最終学歴: 熊本県立済々黌高等学校卒業 コンビ名: くりぃむしちゅー
相方: 有田哲平 事務所: プライム→ナチュラルエイト
有田哲平 · 上田啓介 · おしゃれイズム · Category:上田晋也%  

先ほど実行した際と同様の結果が表示されます。

エラーが出る場合

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
        at selenide.sample.AppKt.main(App.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

Kotlinのライブラリがないようなので、jarを作る際に依存関係に含まれるファイルをコピーするオプションを追加します。

val jar:Jar by tasks.getting(Jar::class) {
    from(configurations.compileClasspath.get().map {if (it.isDirectory) it else zipTree(it)})
}

テスト自動化するためのフレームワークでしたが、単純なブラウザ操作にも使用できますね。シンプルに書けるので、やりやすかったです。業務で使用する機会があれば、使いたいなと思います。