Selenium RemoteWebDriver を試してみる

クライアントPCの上で仮想環境を構築し、その上でSeleniumを動かします。 まずはVagrant仮想マシンを作成します。

# -*- mode: ruby -*-

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-19.10"

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update -y
    apt update -y
    apt install fonts-ipafont fonts-ipaexfont default-jdk unzip -y

    # Install Google Chrome
    wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
    echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list

    apt update -y
    apt install google-chrome-stable -y
    
    # Install Selenium Environment
    mkdir /home/vagrant/selenium
    cd /home/vagrant/selenium
    wget https://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_linux64.zip
    unzip chromedriver_linux64.zip
    wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar
  SHELL
end
vagrant up

仮想環境内でHubとNodeの2つのプロセスを立ち上げます。HubとNodeは1:Nの関係になるようです。

Hub

$ cd selenium/
$ DISPLAY=:99.0 java -Dwebdriver.gecko.driver=geckodriver -jar selenium-server-standalone-3.141.59.jar  -role hub

Node

$ DISPLAY=:99.0 java -Dwebdriver.gecko.driver=geckodriver -jar selenium-server-standalone-3.141.59.jar -role node -hub http://localhost:4444

http://192.168.33.10:4444/grid/console をブラウザで開くと現在の状況が確認できます。

Seleniumのコードを用意します。

import org.junit.After
import org.junit.Before
import org.junit.Test
import org.openqa.selenium.OutputType
import org.openqa.selenium.TakesScreenshot
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.remote.RemoteWebDriver
import java.io.File
import java.net.URL

class RemoteTest {
  var driver: WebDriver? = null
  @Before
  fun setup() {
//    val option = FirefoxOptions() // 今は使えない
    val option = ChromeOptions()
    option.setHeadless(true);
    driver = RemoteWebDriver(URL("http://192.168.33.10:4444/wd/hub"), option)
  }
  @Test
  fun test1() {
    driver!!.get("https://www.yahoo.co.jp/");

    val ss = (driver as TakesScreenshot).getScreenshotAs(OutputType.FILE)
    ss.renameTo(File("./yahoo_top.png"))
  }
  @After
  fun dispose() {
    if (driver != null) {
      driver!!.quit();
    }
  }
}

実行するとホスト側のルートディレクトリにスクリーンショットが保存されます。

f:id:taku-woohar:20200208154440p:plain
実行結果

問題なく実行できました。