C#でSelenium2を使用して主要ブラウザを動かしてみた

# はじめに
C#でSelenium2(Selenium Webdriver)[^1]を使ってみようと思っている方に
どのようなものかを実際に動かしてもらうことを目的としています。

# やってみること
主要ブラウザ[^2]でgoogleにアクセスしてSelenium2と検索する

# 本日のめにゅー
1. VSでコンソールアプリケーションのプロジェクトを新規作成する
2. NuGetから各種パッケージを取得
    - Selenium.Support
    - Selenium.WebDriver
    - Selenium.WebDriver.ChromeDriver
    - Selenium.WebDriver.IEDriver
    - WebDriver.GeckoDriver [^3]
3. 各ブラウザーのウェブドライバーを作成するクラスを作成
4. googleにアクセスしてSelenium2と検索する部分の作成
5. 実行してみる

準備済みのサンプルコードは[こちら](https://github.com/whoshino/Selenium2ConsoleApplicationSample)

## 1. VSでコンソールアプリケーションのプロジェクトを新規作成する
VSからコンソールアプリケーションを作成する

## 2. NuGetから各種パッケージを取得
```xml:packages.config
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Selenium.Support" version="2.53.1" targetFramework="net452" />
  <package id="Selenium.WebDriver" version="2.53.1" targetFramework="net452" />
  <package id="Selenium.WebDriver.ChromeDriver" version="2.24.0.0" targetFramework="net452" />
  <package id="Selenium.WebDriver.IEDriver" version="2.53.1.1" targetFramework="net452" />
  <package id="WebDriver.GeckoDriver" version="0.9.0" targetFramework="net452" />
</packages>
```
## 3. 各ブラウザーのウェブドライバーを作成するクラスを作成する
```csharp:WebDriverFactory.cs
internal class WebDriverFactory
{
    public static IWebDriver CreateInstance(AppSettings.BrowserName browserName)
    {
        switch (browserName)
        {
            case AppSettings.BrowserName.None:
                throw new ArgumentException(string.Format("Not Definition. BrowserName:{0}", browserName));

            case AppSettings.BrowserName.Chrome:
                return new ChromeDriver();

            case AppSettings.BrowserName.Firefox:
                FirefoxDriverService driverService = FirefoxDriverService.CreateDefaultService();
                driverService.FirefoxBinaryPath = @"C:\Program Files (x86)\Mozilla Firefox\firefox.exe";
                driverService.HideCommandPromptWindow = true;
                driverService.SuppressInitialDiagnosticInformation = true;
                return new FirefoxDriver(driverService);

            case AppSettings.BrowserName.InternetExplorer:
                return new InternetExplorerDriver();

            case AppSettings.BrowserName.Edge:
                return new EdgeDriver();

            case AppSettings.BrowserName.Safari:
                return new SafariDriver();

            default:
                throw new ArgumentException(string.Format("Not Definition. BrowserName:{0}", browserName));
        }
    }
}
```

```csharp:AppSettings.cs
internal static class AppSettings
{
    public enum BrowserName
    {
        None,
        Chrome,
        Firefox,
        InternetExplorer,
        Edge,
        Safari
    }
}
```

## 4. googleにアクセスしてSelenium2と検索する部分の作成
```csharp:Program.cs
internal class Program
{
    private static void Main(string[] args)
    {
        // AppSettings.BrowserName.Firefoxを変更することによって対象のブラウザを変更できます
        using (IWebDriver webDriver = WebDriverFactory.CreateInstance(AppSettings.BrowserName.Chrome))
        {
            // https://www.google.co.jp に遷移させる
            webDriver.Url = @"https://www.google.co.jp";

            // #lst-ibの要素を取得する
            IWebElement element = webDriver.FindElement(By.CssSelector("#lst-ib"));

            // 上記取得した要素に対してテキストを入力してサブミット
            element.SendKeys("Selenium2");
            element.Submit();

            // 一瞬で完了するため3秒スリープ
            Thread.Sleep(TimeSpan.FromSeconds(3));

            // ブラウザを閉じる
            webDriver.Quit();
        }
    }
}
```
※Seleniumのリファレンスについては[こちら](http://seleniumhq.github.io/selenium/docs/api/dotnet/index.html)

## 5. 実行してみる
上記が作成できたら実際に実行してみましょう！！
すると、コンソールが立ち上がった後に、ブラウザが立ち上がり見事Selenium2を検索できたかと思います。
WebDriverFactory.CreateInstance()の引数を変更することにより各ブラウザで動作します。 [^4]

# まとめ
一見すごく簡単にできるなと思ったあなたそうなんです！
動かすだけならたいして大変ではありませんでした。

ただ、今回は単純なケースでしたのでこれだけになりますが、
実際はもっと複雑であって、実運用をしていくと結構大変になります。
そこら辺は次回の記事で投稿しようかと思います。

# 注釈
[^1]: こちらのページを閲覧している時点で説明不要かと思いますが、SeleniumとはUIテストの自動化を行うツールです。また、Selenium2(Selenium Webdriver)とはプログラムから呼び出しブラウザを操作するためのドライバーです。
[^2]: 各ブラウザとはChrome, Firefox, InternetExplorer, Edge, Safariを対象にしています。Edge, Safariについては動作確認を行っておりません。また、safariに関してはApple Developerに登録する必須があるようです
[^3]: WebDriver.GeckoDriverはFireFoxを動作させるために必要になります。FireFox v48あたりからないと動作しなくなりました。
[^4]: 当たり前といえば当たり前ですが、実行するには該当のブラウザをインストールしておく必要があります。