SafariDriverの使い方

先日、Seleniumのバージョン2.21がリリースされ、SafariDriverという新たなドライバが加わりました。名前から分かる通り、Apple製のブラウザであるSafariを動かすためのドライバです。

これまで、IE、FirefoxGoogle ChromeOperaAndroidiPhone(iOS版 Safari)用のドライバはありましたが、デスクトップ版Safari用のドライバはありませんでした。Selenium RCを使えばSafariでもテストを動かすことは可能でしたが、JavaScriptサンドボックスによる制限を回避できなかったり、新しいWebDriver APIが使えないなどの欠点がありました。

今回新しく追加されたSafariDriverは、サーバ部分がSafariの機能拡張として実装されており、前述した問題を解決するものになっています。

準備

SafariDriverを使うためには、機能拡張のビルドからインストールまでを自分で行う必要があります(2012年4月17日現在)。今回はその方法について解説したいと思います。

なお、SafariDriverを使うためにはバージョン5.0以上のSafariが必要になりますので、注意してください。

Safari Developer Programへの登録

Safariに独自の機能拡張をインストールする場合、デベロッパ証明書が必要になります。証明書を取得するために、まずはSafari Developer Programの登録を行います。

Safari Developer Program – Apple Developer

上記のURLにアクセスし、「今すぐ参加する」から登録を開始します。

新規登録か、既にAppleデベロッパとして登録済みかどうかを聞かれますので、自身の状況に適切な選択肢を選んで下さい。

私の場合は新規登録で、かつApple IDを持っていたので、「Safariデベロッパプログラムに登録するにあたり現在持っているApple IDを使用します。」を選択しました。

ここから先の画面は選んだ選択肢によって変わってきますが、大きくは変わらないと思うので、私が選んだ選択肢を基準に説明していきます。

次は、個人で登録するか会社で登録するかを聞かれます。私は個人を選択しました。

Apple IDを入力します。

確認画面が表示されるので、問題が無ければ「Continue」をクリック。

使用許諾契約。

登録完了です。「Get Started」をクリックしてメンバーセンターへ。

証明書の取得

登録が完了したので、次は証明書を取得します。メンバーセンターの画面中央あたりにある「Developer Certificate Utility」のアイコンをクリックします。

「Create Certificates」をクリック。

「Add Certificate」をクリック。

証明書の取得に必要な、証明書署名要求(CSR)というものを作成する手順が表示されます。

証明書署名要求を作成する手順はOSによって異なるようです。ここではMacでの作成手順を紹介していますが、Windowsを使用している方は@os0xさんの記事を参照してみてください。

Safari拡張の作り方 – 0xFF

Macで証明書署名要求を作成するには、キーチェーンアクセス.appを使用します。キーチェーンアクセスのメニューから、「証明書アシスタント」 >「 認証局に証明書を要求…」 を選択します。

以下のような画面が表示されるので、「メールアドレス」、「通称」を入力し、「ディスクに保存」を選択後、「続ける」をクリックして下さい。証明書署名要求を保存する場所を聞かれるので、適当な場所を選択して保存します。

これで証明書署名要求が作成できました。

ブラウザに戻って、証明書署名要求の作成手順が表示されている画面から「Continue」をクリックすると、証明書署名要求をアップロードする画面が表示されるので、先ほど作成したファイルを選択し、「Generate」をクリックします。

証明書の発行中…

発行完了!「Continue」で次へ。

発行された証明書をダウンロードします。「Download」ボタンから証明書を適当な場所へ保存します。

ダウンロードした証明書のファイルをダブルクリックすれば、自動的に証明書がインストールされます。これで機能拡張をインストールする準備は完了です。

機能拡張のビルド

次はSafariDriverの機能拡張をビルドして、インストール用のファイルを作成します。ビルド自体は簡単で、必要なファイルをSeleniumリポジトリからチェックアウトし、ビルド用のコマンドを叩くだけです。

$ svn checkout http://selenium.googlecode.com/svn/tags/selenium-2.21/ selenium-2.21
$ cd selenium-2.21
$ ./go safari

ビルドが完了するとbuild/javascript/safari-driverの下にSafariDriver.safariextensionが作られているはずです。これがSafari機能拡張のファイルです。

機能拡張のインストール

作成した機能拡張を、Safariにインストールします。まず、Safariのメニューから環境設定を開き、「詳細」をクリックしてから、「メニューバーに“開発”メニューを表示」を選択します。これでメニューバーに「開発」という項目が増えるので、そこから「機能拡張ビルダーを表示」を選択します。

機能拡張ビルダーのウィンドウの左下に「+」というボタンがあるので、そこから「機能拡張を追加」を選択し、そこで先ほど作成したSafariDriver.safariextensionを選択します。画面に機能拡張が追加されるので、「インストール」をクリックすれば、機能拡張のインストールは完了です。

動かしてみる

ここまででSafariDriverを使うための準備は整いました。実際にSafariDriverでSafariを動かしてみましょう。以下のようなクラスを作成し、実行してみてください。

import static org.openqa.selenium.support.ui.ExpectedConditions.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SafariDriverTest {

    private WebDriver driver;

    @Before
    public void createDriver() {
        driver = new SafariDriver();
    }

    @After
    public void quitDriver() {
        driver.quit();
    }

    @Test
    public void shouldBeAbleToPerformAGoogleSearch() {
        driver.get("http://www.google.co.jp/");
        driver.findElement(By.name("q")).sendKeys("webdriver");
        driver.findElement(By.name("btnG")).click();
        new WebDriverWait(driver, 5).until(titleIs("webdriver - Google 検索"));
    }

}

Safariが起動し、Googleのページが開いたでしょうか?

SafariDriverで出来ないこと

SafariDriverは開発途上なので、以下の機能はまだ実装されていないようです。

  • executeScript()メソッドによるJavaScriptの実行
  • フレームの切り替え
  • ドラッグ&ドロップなどを実現するための、インタラクションAPI

この他にも既知のバグなどがあるようなので、実際に使う際は注意してください。

参考