[Selenium]Selenium 2


1.対象に基づくテスト
1.1 Selenium 2構成
Selenium 2はWebアプリケーションのための自動テストツールであり、それは友好的なAPIを提供しています.自身はクラスライブラリです.テストフレームに依存せず、他のプロセスを起動したり、他のプログラムをインストールしたりする必要はありません.Selenium 1のように先にサービスを開始する必要もありません.
Selenium 2は、各ブラウザに対して開発され、測定されたWebアプリケーションに組み込まれているJavaScriptに取って代わって、ブラウザと緊密に統合され、JavaScriptセキュリティモデルの制限を避けるために、より高度なテストの作成をサポートします.WebDriverはFirefox、IE、Opera、Chromeをサポートし、AndroidとiPhoneのモバイルアプリケーションテストもサポートします.
1.2オブジェクトベース
Selenium 2とSelenium 1は明らかに違っています.これらはブラウザ自動化APIに属していますが、ユーザにとってSelenium 1が提供するより多くのAPIは方法に基づくAPIであり、すべての方法は同じクラスに開放されています.Selenium 2のAPIは対象に向けています.
#Selenium 1
public class Main {
  public static void main(String[] args) {
    DefaultSelenium selenium = new DefaultSelenium("localhost", 4444,
                "*iexplore", "http://www.baidu.com");
    selenium.start();
    selenium.open("selenium.typeKeys(@"//input[@id='kw']","Tester");
    selenium.click(@"//input[@id='su']");
  }
}
#Selenium 2
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword = driver.findElement(By.id("kw"));
    WebElement search = driver.findElement(By.id("su"));
    keyword.sendKeys("Tester");
    search.click();
  }
}
1.3ブラウザの選択
テストを開始する前に、まずSeleniumのインスタンスを作成します.即ち対応するDriverは、Firefox、IE、Chromeに対して、コンピュータに対応するブラウザをインストールするだけでテストを開始できます.AndroidとiPhoneについては、テスト前にサポートソフトをインストールする必要があります.例えば、Firefoxを例にして、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
  }
}
2.試験開始
2.1ブラウザナビゲーションオブジェクト
Selenium 2では、ナビゲーションページには、Navigationオブジェクトが必要であり、WebDriverのnavigate()方法によりNavigationオブジェクトのインスタンスが得られます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
  }
}
このオブジェクトを取得すると、指定されたURL、前進、後退、リフレッシュページなどにジャンプする操作ができます.JAVAでは、to()を使ってジャンプできます.URLをパラメータとして使えばいいです.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
  }
}
ブラウザでは、前進と後退ボタンを押してナビゲーションを行うことができます.back()/forward()方法により、このようなナビゲーション機能を実現することもできます.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    navigation.to("http://www.google.com.hk");
    navigation.back();
    navigation.forward();
  }
}
refresh()を使用すると、ページ全体が更新されます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    navigation.refresh();
  }
}
2.2条件オブジェクトの検索
ページ上の要素を操作する前に、該当する要素を見つける必要があります.検索条件オブジェクトByを使って検索することができます.検索は、HTML要素のIDまたはName属性に従って行うことができます.またはHTMLタグに従って行うことができます.ここで最もよく使われているのは、検索ID属性です.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement search = driver.findElement(By.id("su"));
  }
}
IDと同様に、name()メソッドはNameに従って検索します.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement search = driver.findElement(By.name("wd"));
  }
}
linkText()方法はリンクテキストによって検索しますが、partial Link Text()方法はリンクテキストによって曖昧に検索します.例えば:
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement login1 = driver.findElement(By.linkText("  "));
    WebElement login2 = driver.findElement(By.partialLinkText("  "));
  }
}
className()メソッドは要素のクラス属性によって検索します.tagName()はマーク名によって検索して最初のマッチ項目に戻ります.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword1 = driver.findElement(By.className("s_ipt"));
    WebElement keyword2 = driver.findElement(By.tagName("input"));
  }
}
上記の方法が位置合わせできない場合、xpath()で検索できます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement search = driver.findElement(By.xpath("//input[@id='su']"));
  }
}
2.3操作ページ要素
WebElementのオブジェクト例はWebDriverのfindElement()によって取得できます.ページ要素を取得すると、ページ要素を様々に操作することができます.
click()メソッドは、要素をクリックする操作を実行するために使用され、sendKeys()メソッドは、input要素にテキストを入力するために使用されます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword = driver.findElement(By.id("kw"));
    WebElement search = driver.findElement(By.id("su"));
    keyword.sendKeys("Tester");
    search.click();
  }
}
clear()メソッドは、例えば、空のinput要素の値をクリアするために使用される.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword = driver.findElement(By.id("kw"));
    keyword.sendKeys("Tester");
    keyword.clear();
  }
}
submit()メソッドは、指定された要素があるform要素を提出するために使用されます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword = driver.findElement(By.id("kw"));
    WebElement search = driver.findElement(By.id("su"));
    keyword.sendKeys("Tester");
    keyword.submit();
  }
}
2.4ページおよびページ要素の内容を取得する
あるページにジャンプしたり、あるページ要素を取得したりした後、それを操作する以外に、その内容を取得することができます.例えば、getTitle()メソッドは、現在のウェブページのタイトルを返すために使用され、getCurrenntUrl()方法は、現在のウェブページのURLを取得するために使用される.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    String title = driver.getTitle();
    String url = driver.getCurrentUrl();
  }
}
get Text()メソッドは、リンク、テキストなどのある要素のテキスト値を格納するために使用されます.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement link = driver.findElement(By.name("tj_login"));
    String text = link.getText();
  }
}
isSelected()メソッドは、チェックボックスまたは単一選択ボックスのチェックを保存するために使用され、戻り値はtrueまたはfalseであり、例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement link = driver.findElement(By.name("tj_login"));
    link.click();
    WebElement checkbox = driver.findElement(By.id("TANGRAM__PSP_8__memberPass"));
    boolean isSelected = checkbox.isSelected();
  }
}
getTagName()メソッドは、要素のタグ名を取得するために使用されます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement link = driver.findElement(By.name("tj_login"));
    String tagName = link.getTagName();
  }
}
isEnbaled()方法は、inputなどの要素の編集可能な状態を格納するために用いられ、isDisplayed()方法は、要素がページ上に表示されているかどうかを検証するために使用される.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword = driver.findElement(By.id("kw"));
    boolean isEnabled = keyword.isEnabled();
    boolean isDisplayed = keyword.isDisplayed();
  }
}
get Attribute()メソッドは、指定された属性の値を取得するために使用されます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement keyword = driver.findElement(By.id("kw"));
    String value = keyword.getAttribute("value");
  }
}
3.試験処理
3.1ポップアップダイアログ処理
JavaScriptには3つのポップアップダイアログがあります.Alert、Confirmation、Propt、Selenium 1はJavaScript注入方式でテストを行います.したがって、直接ダイアログを処理することができません.Selenium 2は各ブラウザに対して開発されたものです.JavaScriptセキュリティモデルによる制限を回避したので、ダイアログが成功します.
Selenium 2では、ポップアップダイアログはAlertオブジェクトとして統一されています.Alertオブジェクトを呼び出す方法だけでいいです.Accept()メソッドは、ポップアップダイアログの確認ボタンをクリックします.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement btn = driver.findElement(By.id("getAlert"));
    btn.click();
    driver.switchTo().alert().accept();
  }
}
dismis()メソッドは、ポップアップダイアログのキャンセルボタンをクリックします.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement btn = driver.findElement(By.id("getAlert"));
    btn.click();
    driver.switchTo().alert().dismiss();
  }
}
sendKeys()メソッドは、ダイアログのポップアップにテキストを入力します.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement btn = driver.findElement(By.id("getAlert"));
    btn.click();
    driver.switchTo().alert().sendKyes("Hello World");
  }
}
get Text()メソッドは、ポップアップダイアログのテキストコンテンツを取得するために使用されます.例えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement btn = driver.findElement(By.id("getAlert"));
    btn.click();
    string text = driver.switchTo().alert().getText();
  }
}
3.2マルチウィンドウ処理
Webテストを行う時、いくつかのサブウィンドウがイジェクトされ、複数のウィンドウの間で切り替えられます.複数のウィンドウの間で切り替えるには、まず各ウィンドウの一意の識別子(ハンドル)を取得しなければならず、getWindowHandles()方法によって、開いているすべてのウィンドウの識別子を取得し、それをセットで返すことができる.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    String[] handles = new String[driver.getWindowHandles().size];
    driver.getWindowHandles().toArray(handles);
    for (int i = 0; i  
  

, ( ) , , :

public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement loginLink = driver.findElement(By.name("tj_login"));
    loginLink.click();
    WebElement regLink = driver.findElement(By.className("pass-reglink"));
    regLink.click();
    String[] handles = new String[driver.getWindowHandles().size];
    driver.getWindowHandles().toArray(handles);
    driver.switchTo().window(handles[1]);
  }
}
3.3
Selenium 2では、Cookie、タイムアウト 、ブラウザウィンドウなど、Optionsオブジェクトを して を することができます.get Cookies() により、 のCookieのセットを することができ、 み り、 、 することができます. えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    java.util.Set cookies = driver.manage().getCookies();
    Cookie[] allCookies = new Cookie[cookies.size()];
    cookies.toArray(allCookies);
    java.util.Calendar calendar = java.util.Calendar.getInstance();
    calendar.add(java.util.Calendar.Date, +1);
    java.util.Date date = calendar.getTime();
    Cookie newCookie = new Cookie("newcookie", "value", "baidu.com", "",date);
    cookies.add(newCookie);
    cookies.remove(allCookies[cookies.size()-1]);
  }
}
window() により、フォームの とサイズを するなど、 のウィンドウを にコントロールできます.
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    Window window = driver.manage().window();
    System.out.println(window.getPosition().x);
    System.out.println(window.getPosition().y);
    System.out.println(window.getSize().width);
    System.out.println(window.getSize().height);
    window.maximize();
  }
}
timeouts()メソッドは、3つの を むTimeoutsオブジェクトを します.implicit Waitメソッド スクリプトは、 の ち 、set PageLoadTimeout()メソッド ページ のタイムアウト 、set Script Timeout()メソッド スクリプト ステップ のタイムアウト 、 えば:
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    Timeouts timeouts = driver.manage().timeouts();
    timeouts.implicitlyWait(30, java.util.concurrent.TimeUnit.SECONDS);
    timeouts.setPageLoadTimeout(30, java.util.concurrent.TimeUnit.SECONDS);
    timeouts.setScriptTimeout(30, java.util.concurrent.TimeUnit.SECONDS);
  }
}
3.4
テストが したら、 つの でテストを することができます. つはクローズド() を って、WebDriverの のウィンドウを じることです.もう つは、 にquit() を って、すべてのウィンドウを じることです. えば、
public class Main {
  public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    Navigation navigation = driver.navigate();
    navigation.to("http://www.baidu.com");
    WebElement loginLink = driver.findElement(By.name("tj_login"));
    loginLink.click();
    WebElement regLink = driver.findElement(By.className("pass-reglink"));
    regLink.click();
    String[] handles = new String[driver.getWindowHandles().size];
    driver.getWindowHandles().toArray(handles);
    driver.switchTo().window(handles[1]);
    driver.close();
    driver.switchTo().window(handles[0]);
    driver.quit();
  }
}