Selenium WebDriverとJavaで特定のウィンドウだけを閉じる方法をわかりやすく解説
Selenium WebDriverでは、複数開いているウィンドウの中から特定のウィンドウだけを選んで閉じることが可能です。その際に活躍するのがgetWindowHandlesメソッドとgetWindowHandleメソッドです。この2つを組み合わせることで、ポップアップなどの子ウィンドウも柔軟に制御できます。
ウィンドウハンドルの基本
getWindowHandlesメソッドは、現在開いているすべてのウィンドウハンドルを取得し、Set型のコレクションに格納します。一方、getWindowHandleメソッドは、現在フォーカスが当たっているブラウザウィンドウのハンドルのみを返します。Setデータ構造を扱うためには、コード内にimport java.util.Setおよびimport java.util.Listのインポート文を追加しておく必要があります。
switchTo().window でウィンドウを切り替える
デフォルトの状態では、driverオブジェクトがアクセスできるのは親ウィンドウの要素だけです。親ウィンドウから子ウィンドウへフォーカスを移すには、switchTo().windowメソッドを使用し、引数に子ウィンドウのハンドルIDを渡します。逆に、子ウィンドウから親ウィンドウへ戻るときも同じく、switchTo().windowメソッドに親ウィンドウのハンドルIDを渡して切り替えます。
また、個別のウィンドウを閉じる場合はclose()メソッドを使います。全ウィンドウを一括で終了したい場合はquit()メソッドを使う点が異なるので、用途に応じて使い分けましょう。
実装例
以下は、Googleログインボタンをクリックして開いた子ウィンドウのうち、タイトルが「Sign in - Google Accounts」であるウィンドウだけを検出して閉じるサンプルコードです。
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;
public class CloseSpecificWindow {
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(5, TimeUnit.SECONDS);
// 親ウィンドウのハンドルを取得
String m = driver.getWindowHandle();
driver.findElement(By.id("login-google-button")).click();
// ウィンドウハンドルをSetに格納
Set w = driver.getWindowHandles();
// 各ウィンドウハンドルを反復処理
for (String h: w){
// 対象ウィンドウへ切り替え
driver.switchTo().window(h);
String s= driver.getTitle();
// 特定のタイトルを持つウィンドウかどうか判定
if(s.equalsIgnoreCase("Sign in - Google Accounts")){
System.out.println("閉じる対象のウィンドウタイトル: "+ driver.getTitle());
driver.close();
}
}
// 親ウィンドウへ切り替え
driver.switchTo().window(m);
driver.quit();
}
}
コードのポイント
このコードの流れを整理すると次のようになります。
まずgetWindowHandle()で親ウィンドウのハンドルを変数に保存しておきます。次にボタンをクリックして子ウィンドウを開き、getWindowHandles()ですべてのハンドルを取得します。取得したハンドルを拡張for文で1つずつ取り出し、switchTo().window(h)で該当ウィンドウに移動しながらタイトルを確認します。目的のタイトルと一致したウィンドウに対してのみclose()を呼び出すことで、他のウィンドウを残したまま特定のウィンドウだけを閉じられます。
最後にswitchTo().window(m)で親ウィンドウへ制御を戻し、quit()でセッション全体を終了しています。この手順を覚えておけば、マルチウィンドウ環境での自動テストを安定して構築できるでしょう。
実行結果

-
PythonとSelenium WebDriverで特定のドメインにCookieを設定する方法
PythonのSelenium WebDriverでは、特定のドメインに対してCookieを設定することができます。Cookieはブラウザが送受信する情報を保持するために使われるもので、キーと値(key-value)のペア形式で構成され、サーバーからブラウザへ渡されるメッセージのような役割を果たします。Cookieを追加するにはadd_cookieメソッドを使用します。このメソッドにはキーと値がパラメータとして渡されます。すべてのCookieを取得したい場合はget_cookiesメソッドを、特定のCookieだけを取得したい場合はget_cookieメソッドを使用します。また、Cookieを
-
PythonでPhantomJSとSelenium WebDriverを使ってウィンドウサイズを設定する方法
PhantomJSとSelenium WebDriverでウィンドウサイズを設定する方法Pythonでは、PhantomJSとSelenium WebDriverを組み合わせることで、ブラウザのウィンドウサイズを自由に制御できます。PhantomJSを利用するには、まずwebdriver.PhantomJSクラスのドライバーオブジェクトを作成します。その際、phantomjs.exeドライバーファイルへのパスを引数として渡してください。ウィンドウサイズを設定するには、set_window_sizeメソッドを使用し、幅と高さを引数として指定します。また、現在のブラウザのウィンドウサイズを取得した