Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】Selenium WebDriverで子ブラウザウィンドウを閉じる方法をわかりやすく解説

Selenium WebDriverでテストを自動化していると、リンクやボタンのクリックをきっかけに新しいブラウザウィンドウ(子ウィンドウ)が開くケースがよくあります。本記事では、Javaを使用して子ブラウザウィンドウを閉じ、親ウィンドウへ制御を戻す方法を具体的なコード例とともに解説します。

ウィンドウハンドルの基本

子ウィンドウの操作にはgetWindowHandlesメソッドとgetWindowHandleメソッドを使用します。getWindowHandlesメソッドは、現在開いているすべてのウィンドウのハンドルをSetデータ構造に格納して取得するために使われます。

一方、getWindowHandleメソッドは、現在アクティブになっているブラウザウィンドウのハンドルのみを返します。取得した複数のウィンドウハンドルを順番に処理するには、iteratorメソッドを使用します。コード内でSetを扱うために「import java.util.Set」を、イテレータを利用するために「import java.util.List」と「import java.util.Iterator」をあらかじめインポートしておく必要があります。

switchTo().window()によるウィンドウの切り替え

デフォルトの状態では、driverオブジェクトがアクセスできるのは親ウィンドウの要素だけです。親ウィンドウから子ウィンドウへフォーカスを移すには、switchTo().windowメソッドを呼び出し、引数として子ウィンドウのハンドルIDを渡します。

同様に、子ウィンドウでの作業が完了した後、親ウィンドウへ制御を戻す場合も、switchTo().windowメソッドに今度は親ウィンドウのハンドルIDを渡して呼び出します。

主なメソッドの役割まとめ

  • getWindowHandles():開いているすべてのウィンドウのハンドルをSetとして取得する
  • getWindowHandle():現在アクティブなウィンドウのハンドルを取得する
  • switchTo().window(ハンドルID):指定したウィンドウへ操作対象を切り替える
  • close():現在アクティブなウィンドウのみを閉じる
  • quit():すべてのウィンドウとドライバセッションを終了する

コード実装例

以下は、IndeedのログインページでGoogleログインボタンをクリックして開かれた子ウィンドウを閉じ、その後親ウィンドウへ戻るサンプルコードです。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
import java.util.List;
import java.util.Set;
import java.util.Iterator;
public class CloseChildWindow {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://secure.indeed.com/account/login");
        // 暗黙的待機
        driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
        driver.findElement(By.id("login-google-button")).click();
        // すべてのウィンドウハンドルを取得
        Set w = driver.getWindowHandles();
        // ウィンドウハンドルを反復処理
        Iterator t = w.iterator();
        String ch = t.next();
        String pw = t.next();
        // 子ウィンドウへ切り替え
        driver.switchTo().window(ch);
        System.out.println("Child window title "+ driver.getTitle());
        // 子ブラウザウィンドウを閉じる
        driver.close();
        // 親ウィンドウへ切り替え
        driver.switchTo().window(pw);
        System.out.println("Parent window title: "+ driver.getTitle());
        driver.quit();
    }
}

注意: getWindowHandles()が返すハンドルの並び順は仕様上保証されていません。実際のプロジェクトでは、各ウィンドウのタイトル(getTitle())やURLを確認しながら親・子を判定する実装にすると、より安定した自動テストになります。

実行結果

コードを実行すると、コンソールに子ウィンドウのタイトルと親ウィンドウのタイトルがそれぞれ出力されます。子ウィンドウがclose()メソッドによって正しく閉じられ、その後switchTo().window()により親ウィンドウへ制御が戻っていることが確認できます。最後にquit()を呼び出すことで、残りのウィンドウとドライバセッションが完全に終了されます。

  1. tkinterでウィンドウを閉じる方法|destroy()メソッドの使い方を解説

    tkinterを使えば、Pythonで手軽にGUIアプリケーションを作成できます。しかし、タイトルバー右上の×ボタン以外の方法でウィンドウやフレームを閉じたい場合、どのように実装すればよいか悩むこともあるでしょう。そのようなときに役立つのが、ウィンドウを破棄して閉じるための .destroy() メソッドです。tkinterの各ウィジェットや属性は互いに独立しているため、「ウィンドウを閉じる処理」を専用の関数として分離して定義できます。これにより、ボタンのクリックイベントからウィンドウを閉じる動作を自由に制御可能です。サンプルコード# ライブラリをインポート from tkinter impo

  2. PythonでPhantomJSとSelenium WebDriverを使ってウィンドウサイズを設定する方法

    PhantomJSとSelenium WebDriverでウィンドウサイズを設定する方法Pythonでは、PhantomJSとSelenium WebDriverを組み合わせることで、ブラウザのウィンドウサイズを自由に制御できます。PhantomJSを利用するには、まずwebdriver.PhantomJSクラスのドライバーオブジェクトを作成します。その際、phantomjs.exeドライバーファイルへのパスを引数として渡してください。ウィンドウサイズを設定するには、set_window_sizeメソッドを使用し、幅と高さを引数として指定します。また、現在のブラウザのウィンドウサイズを取得した