SeleniumWebDriver
使ってみようず
     鍋駆動 2012/02/20
     お だ
自己紹介
織田 信亮(おだ しんすけ)
大阪で開発者しています

http://d.hatena.ne.jp/odashinsuke/
Twitter:@shinsukeoda
Selenium WebDriver ってなに?
http://seleniumhq.org/docs/03_webdriver
.html
  Selenium が WebDriver と統合された
  Selenium 1.0 だと JavaScript/HTML で
  記述がメイン
  WebDriver は、Selenium ではセキュリ
  ティで制限されていたものが回避出来る
  Selenium 2.0 で統合!
API が提供されている言語
Java
C#
Python
Ruby
PHP
Perl
提供されている WebDriver
 HtmlUnit Driver
 Firefox Driver
 Internet Explorer Driver
 Chrome Driver
 Opera Driver
 iPhone Driver
 Android Driver
みんな大好き IE Driver を使う
 前準備
  IE がインストールされている
  ツール => インターネット オプション =>
  セキュリティ タブ => 全てのゾーンで「保
  護モードを有効にする」チェック値を統一
C# で
 Visual Web Developer 2010 Express
 (VWD2010)
 拡張機能マネージャーから NuGet インス
 トール
 Package Manage Console(NuGet) から
   Install-Package Selenium.WebDriver
   Install-Package Selenium.Support

   Support は便利だからいれてます
[Test]
public void 検索() {
  var driver = new InternetExplorerDriver();
  try {
    driver.Navigate().GoToUrl("http://www.bing.com");
    var txt条件 = driver.FindElementByName("q");
    txt条件.Clear();
    txt条件.SendKeys("Microsoft");
    var btn検索 = driver.FindElementByXPath(
      "//input[@type='submit' and @name='go']");
    btn検索.Click();
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 10));
    wait.Until(ExpectedConditions.TitleIs("Microsoft - Bing"));
    var lbl件数 = driver.FindElementById("count");
    Regex.Match(lbl件数.Text, "(?<=of ).*(?= results)").Value
      .Is("527,000,000");
  } finally {
    driver.Quit();
  }
}
[TestFixture]
public class PageObjectTest {
  [Test]
  public void 検索() {
    var driver = new InternetExplorerDriver();
    try {
      var instance = BingSearch.Create(driver);
      instance.Input検索条件("Microsoft");
      instance.Click検索();
      instance.Get検索結果件数().Is("527,000,000");
    } finally {
      driver.Quit();
    }
  }
}
public class BingSearch {
 public static BingSearch Create(RemoteWebDriver driver) {
   var instance = new BingSearch(driver);
   driver.Url = "http://www.bing.com";
   return instance;
 }
 private readonly RemoteWebDriver driver;
 private BingSearch(RemoteWebDriver driver) {
   this.driver = driver;
 }
 private IWebElement txt条件 {
   get { return driver.FindElementByName("q"); }
 }
 private IWebElement btn検索 {
   get { return driver.FindElementByXPath(
    "//input[@type='submit' and @name='go']"); }
 }
 private IWebElement lbl件数 {
   get { return driver.FindElementById("count"); }
 }
public void Input検索条件(string 条件) {
    this.txt条件.Clear();
    this.txt条件.SendKeys(条件);
  }
  public void Click検索() {
    this.btn検索.Click();
    var wait = new WebDriverWait(this.driver, new TimeSpan(0, 0, 10));
    wait.Until(ExpectedConditions.TitleIs("Microsoft - Bing"));
  }
  public string Get検索結果件数() {
    return Regex.Match(this.lbl件数.Text,
     "(?<=of ).*(?= results)").Value;
  }
}

https://gist.github.com/1861739
Java (Maven) で
 selenium-java
  <dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>2.18.0</version>
  </dependency>

 これいれると、ie-driver や support も
 ついてくる
@Test
public void 検索() {
  RemoteWebDriver driver = new InternetExplorerDriver();
  try {
    driver.navigate().to("http://www.bing.com");
    WebElement txt条件 = driver.findElementByName("q");
    txt条件.clear();
    txt条件.sendKeys("Microsoft");
    WebElement btn検索 = driver.findElementByXPath(
      "//input[@type='submit' and @name='go']");
    btn検索.click();
    Wait<WebDriver> wait = new WebDriverWait(driver, 10);
    wait.until(titleIs("Microsoft - Bing"));
    WebElement lbl件数 = driver.findElementById("count");
    assertThat(lbl件数.getText()
     .replaceAll("(.*of )(.*)( results)", "$2"), is("527,000,000"));
  } finally {
    driver.quit();
  }
}
@Test
public void 検索() {
  RemoteWebDriver driver = new InternetExplorerDriver();
  try {
    BingSearch instance = BingSearch.create(driver);
    instance.input検索条件("Microsoft");
    instance.click検索();
    assertThat(instance.get検索結果件数(), is("527,000,000"));
  } finally {
    driver.quit();
  }
}
public class BingSearch {
 private final RemoteWebDriver driver;
 public static BingSearch create(RemoteWebDriver driver) {
   BingSearch instance = new BingSearch(driver);
   driver.navigate().to("http://www.bing.com");
   return instance;
 }
 private BingSearch(RemoteWebDriver driver) {
   this.driver = driver;
 }
 private WebElement txt条件() {
   return driver.findElementByName("q");
 }
 private WebElement btn検索() {
   return driver.findElementByXPath(
    "//input[@type='submit' and @name='go']");
 }
 private WebElement lbl件数() {
   return driver.findElementById("count");
 }
public void input検索条件(String 条件) {
      this.txt条件().clear();
      this.txt条件().sendKeys(条件);
    }
    public void click検索() {
      this.btn検索().click();
      Wait<WebDriver> wait = new WebDriverWait(driver, 10);
      wait.until(titleIs("Microsoft - Bing"));
    }
    public String get検索結果件数() {
      return this.lbl件数().getText().replaceAll(
       "(.*of )(.*)( results)", "$2");
    }
}

    https://gist.github.com/1861829
便利なやつ
Wait
   指定条件を満たすまで、wait する(タイム
   アウト指定)
Select
   input type=“select” な WebElement の
   ラッパー
PageFactory
   PageObject の実装を少し楽にしてくれる
Wait
 WebDriverWait が良く使われる
 ExpectedConditions を使って条件指定
 Function を自前で実装も可
 WebDriver driver = null;
 Wait<WebDriver> wait = new WebDriverWait(driver, 10);
 wait.until(ExpectedConditions.titleIs("タイトル"));
 wait.until(new Function<WebDriver, Boolean>() {
   public Boolean apply(WebDriver arg0) {
     try {
       return "タイトル".equals(arg0.getTitle());
     } catch (Throwable e) {
       return null;
     }
   }
 });
Select
WebElement select = null;
List<WebElement> options =
select.findElements(By.tagName("option"));
for (WebElement option : options) {
 option.click(); // 選択させる
 if (option.isSelected()) { // 選択していたら

 }
}
Select wrapper = new Select(select);
// 選択させる
wrapper.selectByIndex(0);
wrapper.selectByValue("hoge");
wrapper.selectByVisibleText("フヒヒ");
// 選択されているもの取得
wrapper.getFirstSelectedOption();
wrapper.getAllSelectedOptions();
PageFactory
 @ ベースで、要素とフィールドのマッピ
 ング

Selenium webdriver使ってみようず

  • 1.
    SeleniumWebDriver 使ってみようず 鍋駆動 2012/02/20 お だ
  • 2.
  • 3.
    Selenium WebDriver ってなに? http://seleniumhq.org/docs/03_webdriver .html Selenium が WebDriver と統合された Selenium 1.0 だと JavaScript/HTML で 記述がメイン WebDriver は、Selenium ではセキュリ ティで制限されていたものが回避出来る Selenium 2.0 で統合!
  • 4.
  • 5.
    提供されている WebDriver HtmlUnitDriver Firefox Driver Internet Explorer Driver Chrome Driver Opera Driver iPhone Driver Android Driver
  • 6.
    みんな大好き IE Driverを使う 前準備 IE がインストールされている ツール => インターネット オプション => セキュリティ タブ => 全てのゾーンで「保 護モードを有効にする」チェック値を統一
  • 7.
    C# で VisualWeb Developer 2010 Express (VWD2010) 拡張機能マネージャーから NuGet インス トール Package Manage Console(NuGet) から Install-Package Selenium.WebDriver Install-Package Selenium.Support Support は便利だからいれてます
  • 8.
    [Test] public void 検索(){ var driver = new InternetExplorerDriver(); try { driver.Navigate().GoToUrl("http://www.bing.com"); var txt条件 = driver.FindElementByName("q"); txt条件.Clear(); txt条件.SendKeys("Microsoft"); var btn検索 = driver.FindElementByXPath( "//input[@type='submit' and @name='go']"); btn検索.Click(); var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 10)); wait.Until(ExpectedConditions.TitleIs("Microsoft - Bing")); var lbl件数 = driver.FindElementById("count"); Regex.Match(lbl件数.Text, "(?<=of ).*(?= results)").Value .Is("527,000,000"); } finally { driver.Quit(); } }
  • 9.
    [TestFixture] public class PageObjectTest{ [Test] public void 検索() { var driver = new InternetExplorerDriver(); try { var instance = BingSearch.Create(driver); instance.Input検索条件("Microsoft"); instance.Click検索(); instance.Get検索結果件数().Is("527,000,000"); } finally { driver.Quit(); } } }
  • 10.
    public class BingSearch{ public static BingSearch Create(RemoteWebDriver driver) { var instance = new BingSearch(driver); driver.Url = "http://www.bing.com"; return instance; } private readonly RemoteWebDriver driver; private BingSearch(RemoteWebDriver driver) { this.driver = driver; } private IWebElement txt条件 { get { return driver.FindElementByName("q"); } } private IWebElement btn検索 { get { return driver.FindElementByXPath( "//input[@type='submit' and @name='go']"); } } private IWebElement lbl件数 { get { return driver.FindElementById("count"); } }
  • 11.
    public void Input検索条件(string条件) { this.txt条件.Clear(); this.txt条件.SendKeys(条件); } public void Click検索() { this.btn検索.Click(); var wait = new WebDriverWait(this.driver, new TimeSpan(0, 0, 10)); wait.Until(ExpectedConditions.TitleIs("Microsoft - Bing")); } public string Get検索結果件数() { return Regex.Match(this.lbl件数.Text, "(?<=of ).*(?= results)").Value; } } https://gist.github.com/1861739
  • 12.
    Java (Maven) で selenium-java <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.18.0</version> </dependency> これいれると、ie-driver や support も ついてくる
  • 13.
    @Test public void 検索(){ RemoteWebDriver driver = new InternetExplorerDriver(); try { driver.navigate().to("http://www.bing.com"); WebElement txt条件 = driver.findElementByName("q"); txt条件.clear(); txt条件.sendKeys("Microsoft"); WebElement btn検索 = driver.findElementByXPath( "//input[@type='submit' and @name='go']"); btn検索.click(); Wait<WebDriver> wait = new WebDriverWait(driver, 10); wait.until(titleIs("Microsoft - Bing")); WebElement lbl件数 = driver.findElementById("count"); assertThat(lbl件数.getText() .replaceAll("(.*of )(.*)( results)", "$2"), is("527,000,000")); } finally { driver.quit(); } }
  • 14.
    @Test public void 検索(){ RemoteWebDriver driver = new InternetExplorerDriver(); try { BingSearch instance = BingSearch.create(driver); instance.input検索条件("Microsoft"); instance.click検索(); assertThat(instance.get検索結果件数(), is("527,000,000")); } finally { driver.quit(); } }
  • 15.
    public class BingSearch{ private final RemoteWebDriver driver; public static BingSearch create(RemoteWebDriver driver) { BingSearch instance = new BingSearch(driver); driver.navigate().to("http://www.bing.com"); return instance; } private BingSearch(RemoteWebDriver driver) { this.driver = driver; } private WebElement txt条件() { return driver.findElementByName("q"); } private WebElement btn検索() { return driver.findElementByXPath( "//input[@type='submit' and @name='go']"); } private WebElement lbl件数() { return driver.findElementById("count"); }
  • 16.
    public void input検索条件(String条件) { this.txt条件().clear(); this.txt条件().sendKeys(条件); } public void click検索() { this.btn検索().click(); Wait<WebDriver> wait = new WebDriverWait(driver, 10); wait.until(titleIs("Microsoft - Bing")); } public String get検索結果件数() { return this.lbl件数().getText().replaceAll( "(.*of )(.*)( results)", "$2"); } } https://gist.github.com/1861829
  • 17.
    便利なやつ Wait 指定条件を満たすまで、wait する(タイム アウト指定) Select input type=“select” な WebElement の ラッパー PageFactory PageObject の実装を少し楽にしてくれる
  • 18.
    Wait WebDriverWait が良く使われる ExpectedConditions を使って条件指定 Function を自前で実装も可 WebDriver driver = null; Wait<WebDriver> wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.titleIs("タイトル")); wait.until(new Function<WebDriver, Boolean>() { public Boolean apply(WebDriver arg0) { try { return "タイトル".equals(arg0.getTitle()); } catch (Throwable e) { return null; } } });
  • 19.
    Select WebElement select =null; List<WebElement> options = select.findElements(By.tagName("option")); for (WebElement option : options) { option.click(); // 選択させる if (option.isSelected()) { // 選択していたら } } Select wrapper = new Select(select); // 選択させる wrapper.selectByIndex(0); wrapper.selectByValue("hoge"); wrapper.selectByVisibleText("フヒヒ"); // 選択されているもの取得 wrapper.getFirstSelectedOption(); wrapper.getAllSelectedOptions();
  • 20.