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の設定]-[ローカルアドレスにはプロキシサーバーを使用しない]にチェックを入れてください。