読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

C# から Selenium Web Driver を利用してみる

「単調な Web の試験を自動化したい」と思うことは良くあります。こういった場合は Selenium が便利です。

Selenium の種類

Selenium には歴史的経緯から、以下のような種類があります。今回は Selenium WebDriver を使います。

  1. Selenium 1(通称、「Selenium Remote Control」または「Selenium RC」)
    • JavaScript として実装されている
    • ブラウザ毎に共通実装なので、「あるブラウザでは動作するが、別のブラウザでは動作しない」という、ブラウザ毎の JavaScript 実装差異の影響を受ける可能性がある
    • ブラウザのサンドボックスにロードされ、実行される。つまり、サンドボックスの制限を受ける
  2. Selenium 2(通称、「Selenium WebDriver」または「WebDriver」)
    • ブラウザ毎にドライバーが提供される
    • ドライバーを経由し、外部からブラウザを制御する
    • Selenium RC のように、サンドボックスの影響は受けない

前提条件

今回は以下の環境でテストしました。

新規プロジェクトの作成

最初に Visual Studio で新規プロジェクトを作成します。Visual Studio を起動し、「ファイル → 新規作成 → プロジェクト」を選択します。

f:id:sig9:20150113001149p:plain

「新しいウインドウ」が開くので、Visual C# テンプレートから「コンソール アプリケーション」を選択後、プロジェクト名を入力します。今回は "MyFirstSelenium" としました。

f:id:sig9:20150113001157p:plain

参照の追加

Selenium Web Driver を Visual Studio のプロジェクトから利用出来るよう、参照の追加を行います。まず、Selenium Web Driver を ダウンロードページ からダウンロードし、展開します。次に Visual Studio のメニューから「プロジェクト → 参照の追加」を選択します。

f:id:sig9:20150112235829p:plain

「参照マネージャ」ダイアログが開くので、展開したファイルのうち、以下をまとめて参照します。

  1. Selenium.WebDriverBackedSelenium.dll
  2. ThoughtWorks.Selenium.Core.dll
  3. WebDriver.dll
  4. WebDriver.Support.dll

f:id:sig9:20150112235841p:plain

参照設定が完了するとソリューションエクスプローラに該当 .dll が表示されます。

f:id:sig9:20150112235849p:plain

Driver のダウンロード

Selenium WebDriver から FireFox だけを利用する場合は追加のドライバーは不要です。しかし、ChromeIE を利用する場合は以下から Driver を追加ダウンロードする必要があります。

ダウンロードしたファイルは展開し、サンプルの実行ファイルと同じディレクトリに配置しておきます。

サンプルコード

以下のようなサンプルコードを用意しました。Chrome, FireFox, IE が次々に起動され、Google で「Cheese!」というキーワードを検索します。

using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;

namespace MyFirstSelenium
{
    class Program
    {
        static void Main(string[] args)
        {
            // Chrome
            IWebDriver chrome = new ChromeDriver();
            SearchGoogle(chrome);

            // InternetExplorer
            IWebDriver ie = new InternetExplorerDriver();
            SearchGoogle(ie);

            // FireFox
            FirefoxBinary firefoxBinary = new FirefoxBinary(@"C:\Program Files (x86)\Mozilla Firefox\firefox.exe");
            FirefoxProfile firefoxProfile = new FirefoxProfile();
            IWebDriver firefox = new FirefoxDriver(firefoxBinary, firefoxProfile);
            SearchGoogle(firefox);
        }

        static void SearchGoogle(IWebDriver _webDriver)
        {
            _webDriver.Url = "https://www.google.co.jp";
            IWebElement element = _webDriver.FindElement(By.Name("q"));
            element.SendKeys("Cheese!");
            element.Submit();
        }
    }
}

IE で「NoSuchElementException」エラーになってしまう場合

IEDriverServer を正しい位置に配置し、サンプルコードにも問題が無いのに IE でのみ、「NoSuchElementException」が発生する場合があります。この場合は IE のインターネットオプションからセキュリティタブを選択し、全てのセキュリティゾーンに対して「保護モードを有効にする」へチェックしておきます。

f:id:sig9:20150113003920p:plain

64bit 版 IEDriverServer で SendKeys での文字送信が遅い場合

64bit 版の IEDriverServer を利用した場合、SendKeys で文字送信した場合、一文字送信する度に 2 〜 5 秒程度と非常に長い時間がかかります。これは既知の問題だそうです。

32bit 版の IEDriverServer を利用することで回避出来、文字送信をスムーズに行うことが出来ます。

FireFox が「Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms」エラーで起動しない場合

ユーザフォルダに 2 バイト文字が含まれていると FireFox が上手く起動しませんでした。

ユーザフォルダに 2 バイト文字を含まなければ FireFox が問題無く、起動します。Microsoft アカウントでユーザ名に 2 バイト文字を登録した状態で、Windows 8/8.1 の初回ログイン時のユーザ作成に Microsoft アカウントを使ってしまうと、ユーザフォルダ名が Microsoft アカウントの名前が利用されてしまい、2 バイト文字になってしまうので要注意です。

Windows の初回ログイン時は(2 バイト文字を含まない)ローカルアカウントを作成し、後でそのローカルアカウントに Microsoft アカウントを紐付ければ OK です。

参考書籍

Satya Avasarala の著作であり、Sky 株式会社の玉川竜司さんが翻訳された 実践 Selenium WebDriver が非常に参考になります。

実践 Selenium WebDriver

実践 Selenium WebDriver