Selenium2

【Java】Selenium2で新規タブを開いたときのお話

More than 1 year has passed since last update.

はじめましてtsuttieです(*'▽')
Seleniumを使って色々としましたので、まとめていければと思ってます。

1. Selenium2を使ってみて

Webアプリのテスト自動化を目的としてSelenium2を使ったので詰まった点を数回に分けてまとめて行きたいと思います。

2. 使用したSelenium

・Selenium IDE
・Selenium Webdriver (Java 3.5.0)
※導入方法についてはわかりやすくまとめていらっしゃる方が多くおりますので、そのあたりのお話は省きます。

3. 【本題】新しくタブを開いたときに動作が止まる

 Selenium2を使っていて最初に躓いたのは新規タブを開いたときでした。
 クリックしたときに現在のタブではなく新規でタブ開くリンクを踏んだときに操作不能になるんです。色々検証してわかった原因としては、新しいタブは開いたときにハンドルは古いタブに向いているということ。画面上では新しいタブを見てる分、少しわかりにくかった・・・(/o\)

解決方法としては、
新しいタブにハンドルを移す!
これだけでした。

とは言っても大体の場合処理をした後に元のページに戻るので元のページのハンドルを保持させたりくらいはしないといけないとは予想されますが・・・
とにかく原因さえわかれば調べるだけ!!

以下の処理で解決することが出来ました。

HandleTest.java
package ~;

import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class HandleTest {

    private WebDriver driver;

    @Before
    public void setUp() throws Exception {
        System.setProperty("webdriver.gecko.driver", "./geckodriver.exe");
        driver = new FirefoxDriver();
    }

    @After
    public void tearDown() throws Exception {
        driver.quit();
    }

    @Test
    public void test() throws InterruptedException {

        try {
            //元のページのハンドルを記憶
            String Handle = driver.getWindowHandle();

            //新しくタブを開くリンクをクリック
            driver.findElement(By.id("LinkID")).click();

            //次のタブのハンドルを用意し、タブが新しく開かれていたらnewHandleに代入する
            String newHandle = null;
            for (String id : driver.getWindowHandles()) {
                if (!id.equals(Handle)) {
                    newHandle = id;
                }
            }
            //newHandleにハンドルを移す
            driver.switchTo().window(newHandle);

        }catch(IOException e){
            System.out.println(e);
        }
    }
}

もっと特殊な処理が必要かと思いましたが、driver.switchTo().window(*)がしっかりと用意されていました!
もし、処理が終わって元のタブに戻ったのであれば
driver.switchTo().window(Handle);
この一行を入れてあげるだけでOKです!
基点となるページが存在するなら最初にハンドルだけ変数に入れていおいてもいいかもしれません。

4. まとめ

タブをガンガン開いたり閉じたりする操作を書くときには処理を入れるのをついつい忘れてしまいそうそうなので、どこにハンドルがむいているのか意識して書いていくように気を付けたいところです。

次は、ハンドルの移動ダイアログ(fancybox)について記載します('ω')ノ

5. 参考資料

u-sukeのメモ: Seleniumで新しいタブを開いた時にハマった