【Selenium】色んなブラウザを動かす(PC編)

Seleniumの各ブラウザ対応

Selenium 1.0ではクライアントサイドJavaScriptの実行によりブラウザを操作していましたが、Selenium 2.0 WebDriverでは各ブラウザのAPIを呼び出すことで操作を行います。そのため、SeleniumがリリースしているWebDriverのライブラリだけではフルブラウザ対応できません。

org.openqa.selenium.WebDriverというインターフェースに関して各ベンダーもしくはどこぞの親切な人が実装を提供しているので、そちらをセットアップする必要が有ります。今回はいくつか提供されているその実装のうち、Google Chrome, Internet Explorerのものを紹介していきます。

合わせて読みたい

実践 Selenium WebDriver

実践 Selenium WebDriver

ちょっと補足

Selenium以外に必要なライブラリは下記の2パターンあります。

org.openqa.selenium.WebDriverインターフェースの実装

FirefoxDriverやChromeDriverのように実装自体がSelenium WebDriverに含まれているものもありますが、ios-driverのように3rdパーティーライブラリもあります。その場合は、Javaのビルドパスの解決からしなければいけません。

各ブラウザのAPIを実行するための実行ファイル

Javaのビルドパスの解決に加えて、各プラットフォーム向けの実行ファイルをセットアップする必要があります。

Selenium WebDriverおさらい

ここで、ちょっとWebDriver自体のおさらいをします。

セットアップ

Mavenプロジェクトの場合、下記のdependencyをpom.xmlに追加します。

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>2.45.0</version>
</dependency>

Jarで直接指定する場合は、ダウンロードページからselenium-javaのzipをダウンロードし、selenium-java-x.x.x.jarを利用します。libs配下には、selenium-javaが依存するjarが同梱されています。

FirefoxDriver

実際にブラウザを動かすには、下記のようにFirefoxDriverを利用してWebDriverのインスタンスを作ります。FirefoxDriverはプラットフォーム内にFirefoxがインストールされているだけで利用可能です。このコードでは、Firefoxが起動してGoogleのトップページを表示します。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class FirefoxTest {
    
    public static void main(String[] args){
         WebDriver driver = new FirefoxDriver();
         driver.get("https://www.google.co.jp/");
         driver.quit();
    }
}

RemoteWebDriver

ブラウザがインストールされているプラットフォームとテストコードを実行するプラットフォームが分かれている場合は、RemoteWebDriverを利用します。仕組みとしては、ブラウザがインストールされているプラットフォームにSelenium Serverを立て、テストコードからRemoteWebDriverを通してHTTP通信にてブラウザをリモート操作します。

1. Selenium Server

ブラウザがインストールされているプラットフォームにSelenium Serverを立てます。ダウンロードページからselenium-server-standalone-x.x.x.jarをダウンロードし、コマンドラインから起動します。

java -jar selenium-server-standalone-x.x.x.jar

2. RemoteWebDriver

org.openqa.selenium.remote.RemoteWebDriverクラスを通して、WebDriverのインスタンスを作ります。RemoteWebDriverのコンストラクタ第一引数には、Selenium ServerのURLを、第二引数にはブラウザの種類を指定します。

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class FirefoxRemoteTest {
    
    public static void main(String args[]) throws MalformedURLException{
        DesiredCapabilities firefox = DesiredCapabilities.firefox();
        WebDriver driver = new RemoteWebDriver(new URL("http://x.x.x.x:4444/wd/hub"), firefox);
        driver.get("https://www.google.co.jp/");
        driver.quit();
    }
}

参考

WebDriverのJavaDoc

RemoteWebDriverServer

Google Chrome

ここからは、デフォルトのFirefoxDriver以外を紹介していきます。 まずは、Google Chromeを操作するためのChromeDriverです。

ChromeDriver

Google Chromeを動作させるためのライブラリです。org.openqa.selenium.chrome.ChromeDriverというJavaの実装自体は、seleniumに同梱されているので、プロジェクトに依存関係を追加する必要はありません。

1. 実行ファイルのインストール

Google ChromeAPIを実行するための実行ファイルをこちらからダウンロードします。

2. システムプロパティ webdriver.chrome.driverの指定

実行ファイルのインストールパスをシステムプロパティ webdriver.chrome.driverで指定します。指定できていれば、あとはGoogle Chromeがプラットフォームにインストールされていれば、利用可能です。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class ChromeTest {
    
    public static void main(String args[]){
          System.setProperty("webdriver.chrome.driver", "/Users/xxxx/Downloads/chromedriver");

          WebDriver driver = new ChromeDriver();
          driver.get("https://www.google.co.jp/");
          driver.quit();
    }
}

ブラウザバージョンとの組み合わせに関して

ChromeDriverの実行ファイルは、ご利用のGoogle Chromeのバージョンに合わせて適切な組み合わせを選ぶ必要が有ります。また、Google Chrome自体は自動アップデートしていくので、開発環境のChromeDriverも追随していく必要が有ります。

Google Chromeのバージョンとの組み合わせは、実行ファイルのダウンロードページnotes.txtに記載されています。最新のGoogle Chrome 43をサポートするChromeDriver実行ファイルは2.15です。

リモート実行

RemoteWebDriverを利用してリモートで実行するには、Selenium Serverの起動時にChromeDriverの実行ファイルパスを指定する必要があります。

java -jar selenium-server-standalone-x.x.x.jar -Dwebdriver.chrome.driver=/Users/xxxx/Downloads/chromedriver

サンプルコード

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class ChromeTest {
    
    public static void main(String args[]) throws MalformedURLException{
        DesiredCapabilities chrome = DesiredCapabilities.chrome();
        WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), chrome);
        driver.get("https://www.google.co.jp/");
        driver.quit();
    }
}

参考

ChromeDriver RemoteWebDriver

Internet Explorer

InternetExplorerDriver

Internet Explorerを動作させるためのライブラリです。org.openqa.selenium.ie.InternetExplorerDriverというJavaの実装自体は、seleniumに同梱されているので、プロジェクトに依存関係を追加する必要はありません。

1. 実行ファイルのインストール

Internet ExplorerAPIを実行するための実行ファイルをこちらからダウンロードします。

2. システムプロパティ webdriver.chrome.driverの指定

実行ファイルのインストールパスをシステムプロパティ webdriver.ie.driverで指定します。指定できていれば、あとはInternet Explorerがプラットフォームにインストールされていれば、利用可能です。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class IETest {

    public static void main(final String[] args) {
        System.setProperty("webdriver.ie.driver", "C://Users/xxxx/Downloads/IEDriverServer_x64_2.45.0/IEDriverServer.exe");

        final WebDriver driver = new InternetExplorerDriver();
        driver.get("https://www.google.co.jp/webhp?hl=ja");
        driver.quit();
    }
}

リモート実行

RemoteWebDriverを利用してリモートで実行するには、Selenium Serverの起動時にInternetExplorerDriverの実行ファイルパスを指定する必要があります。

java -jar selenium-server-standalone-x.x.x.jar -Dwebdriver.ie.driver=C://Users/xxxx/Downloads/IEDriverServer_x64_2.45.0/IEDriverServer.exe

サンプルコード

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class IETest {

    public static void main(final String[] args) throws MalformedURLException {
        final DesiredCapabilities internetExplorer = DesiredCapabilities.internetExplorer();
        final WebDriver driver = new RemoteWebDriver(new URL("http://x.x.x.x:4444/wd/hub"), internetExplorer);
        driver.get("https://www.google.co.jp/webhp?hl=ja");
        driver.quit();
    }
}