C# で Selenium2(WebDriver) を使ってみる

.NET 用のも出ているので試してみる。


NuGet Install-Package で次の2つをインストールします。

Install-Package Selenium.WebDriver
Install-Package Selenium.Support

NuGet Gallery Selenium.WebDriver
NuGet Gallery Selenium.Support


Selenium.WebDriver だけでも動くけど、Support があると、ここらへんで紹介した PageFactory や Wait 等が使えるようになります。
Selenium2 PageFactory の紹介 - お だ のスペース
Selenium2 で wait 処理 - お だ のスペース


単純なログインページのコードはこんな感じです。*1

Signin.cs

using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;
using OpenQA.Selenium.Support.UI;

namespace Sample.PageObjects {
  public class Signin {
    internal IWebDriver Driver { get; set; }
    [FindsBy(How=How.Name, Using="login")]
    IWebElement UserId { get; set; }
    [FindsBy(How=How.Name, Using="passwd")]
    IWebElement Password { get; set; }
    [FindsBy(How = How.XPath, Using = "//input[@type='submit' and @value='サインイン']")]
    IWebElement Submit { get; set; }

    private static readonly TimeSpan TIMEOUT = new TimeSpan(0, 0, 10); // 10秒
    private static readonly By MENU_LOCATOR = By.Id("c_content");

    public static Signin CreateInstance(IWebDriver driver) {
      var url = "https://login.live.com/login.srf";
      driver.Url = url;
      var wait = new WebDriverWait(driver, TIMEOUT);
      wait.Until(ExpectedConditions.TitleIs("Windows Live へようこそ"));
      var login = new Signin() { Driver = driver };
      PageFactory.InitElements(driver, login);
      return login;
    }

    public Menu Login(string userId, string password) {
      this.UserId.SendKeys(userId);
      this.Password.SendKeys(password);
      this.Submit.Click();

      var wait = new WebDriverWait(this.Driver, TIMEOUT);
      wait.Until(ExpectedConditions.ElementExists(MENU_LOCATOR));

      var menu = new Menu() { Driver = this.Driver };
      menu.Initialize();
      return menu;
    }
  }
}

Program.cs

using System;
using OpenQA.Selenium.IE;
using Sample.PageObjects;

namespace Sample {
  class Program {
    static void Main(string[] args) {
      var driver = new InternetExplorerDriver();
      var login = Signin.CreateInstance(driver);
      var menu = login.Login("UserID", "Password");
      ...
    }
  }
}

※InternetExplorerDriver を使う場合は、InternetExplorerDriver - selenium - Everything you wanted to know about the Internet Explorer driver - Browser automation framework - Google Project Hosting を参考に、ツール => インターネット オプション => セキュリティ タブ => 全てのゾーンで 保護モードを有効にする チェックを統一する必要があります。
Java 版と比べると、若干メソッド数が少なかったりしますし、import static が無いので static メソッドの呼び出し*2が冗長な感じもしますが同じように動きますね!

*1:Windows Live にしました

*2:ExpectedConditions とか