3 WebDriverの動作確認
WebDriverの基本を確認しながら、Firefox、IE、Chromeの3つのブラウザでテストを実行してみましょう。
3.1 WebDriverの基本のキ
先ほどSelenium IDEからエクスポートしたGoogleTest.javaをEclipseにインポートし、中身を確認します。
setUp()メソッドは、①でブラウザを操作するためのWebDriverクラスを生成し、ブラウザを起動しています。②では要素が見つからない場合の待機時間を指定しています。30秒だと長すぎる場合がほとんどだと思いますので、10秒くらいに変更しておきましょう。
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver(); // ①ブラウザを起動
baseUrl = "https://www.google.co.jp/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); // ②要素が見つからない場合の待機時間
}
testGoogle()メソッドは③で指定したURLのページを開き、④で入力項目をクリアし、⑤で検索キーワードを入力しています。⑥は検索ボタンのクリック、⑦は検索結果のリンクをクリックしています。
@Test
public void testGoogle() throws Exception {
driver.get(baseUrl + "/"); // ③ページを開く
driver.findElement(By.id("lst-ib")).clear();// ④フォームをクリア
driver.findElement(By.id("lst-ib")).sendKeys("Selenium"); // ⑤文字を入力
driver.findElement(By.name("btnK")).click();// ⑥ボタンをクリック
driver.findElement(By.linkText("Selenium - Web Browser Automation")).click();// ⑦リンクをクリック
}
④~⑦ではfindElement()メソッドを使用して画面の要素を取得しています。引数にidやname、CSSセレクタを指定します。
③のget()と④~⑦のfindElement()は、ブラウザを操作するためのクラスであるWebDriverのメソッドです。④のclear()と⑤sendKeys()と⑥click()は、画面要素を扱うためのクラスであるWebElementのメソッドです。
この2つのクラスを使いこなせば、ほとんどのことができますので、APIをよく読んでおきましょう。
tearDown()メソッドでは、⑧でブラウザを閉じています。
@After
public void tearDown() throws Exception {
driver.quit(); // ⑧ブラウザを閉じる
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
3.2 Firefoxで実行
- GoogleTest.javaを選択してJUnitTestを実行します。
- Firefoxが起動し、テストが実行されることを確認します。
3.3 IEで実行
(1)①のようにコードを書き換えます。
@Before
public void setUp() throws Exception {
driver = new InternetExplorerDriver(); // ①IE用に書き換え
baseUrl = "https://www.google.co.jp/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
(2)JunitTestを実行し、IEが起動してテストが実行されることを確認します。
(3)以下のように、“lst-ib”というIDが見つからないというエラーが発生します。
org.openqa.selenium.NoSuchElementException: Unable to find element with id == lst-ib (WARNING: The server did not provide any stacktrace information)
Googleの画面を確認すると、FirefoxでアクセスしたときとIEでアクセスしたときでHTMLが異なっているためにエラーになったことが分かりました。
(4)以下のようにコードを修正し、ブラウザによって処理を分けます。②でWebDriverが使用しているブラウザ名を取得しています。
@Test
public void testGoogle() throws Exception {
driver.get(baseUrl + "/");
String browserName = ((HasCapabilities) driver).getCapabilities()
.getBrowserName(); // ②ブラウザ名を取得
if (browserName.equals("firefox")){
driver.findElement(By.id("lst-ib")).clear();
driver.findElement(By.id("lst-ib")).sendKeys("Selenium");
driver.findElement(By.name("btnK")).click();
} else {
driver.findElement(By.name("q")).clear();
driver.findElement(By.name("q")).sendKeys("Selenium");
}
driver.findElement(By.linkText("Selenium - Web Browser Automation")).click();
}
(5)JunitTestを実行し、IEが起動してテストが正常に終了することを確認します。
3.4 Chromeで実行
(1)以下のようにコードを書き換えます。③ではChrome.exeのロケーション、④ではchromedriver.exeのパスを設定しています。なお、chromedriver.exeのパスはIEと同様に環境変数でパスを通してもOKです。
@Before
public void setUp() throws Exception {
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.binary", "C:/Program Files (x86)/Google/Chrome/Application"); // ③Chrome.exeのロケーション
System.setProperty("webdriver.chrome.driver", " C:/chromedriver_win32/chromedriver.exe"); // ④chromedriver.exeのパス
driver = new ChromeDriver(capabilities);
baseUrl = "https://www.google.co.jp/";
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}
(2)JunitTestを実行し、Chromeが起動してテストが実行されることを確認します。
Proxy経由でインターネットに接続している場合、次のようなエラーになることがあります。
org.openqa.selenium.WebDriverException: chrome not reachable
この場合、[インターネットオプション]-[接続]-[LANの設定]-[ローカルアドレスにはプロキシサーバーを使用しない]にチェックを入れてください。
