「getWindowHandles」実行で複数のウインドウハンドルを取得できます。
カレントウインドウ(制御対象になっているウインドウ)のハンドルのみを取得する「getWindowHandle」と異なり「getWindowHandles」はカレントセッション(指定したインスタンス)の全てのハンドルを取得していきます。そして複数取得したウインドウハンドルをswitchTo.window(xxx)で指定することで制御したいウインドウ(ブラウザ)を切り替えることが出来ます。
「getWindowHandles」のウインドウハンドル取得順序ですが、最初にインスタンスウインドウ(一番初めに開いたウィンドウ)のウインドウハンドルを取得し、それ以降は最も新しい(最後に開いた)ウインドウからウインドウハンドルを取得していきます。
下記サンプルでは、まず初めにインスタンスウインドウとなるgetWindowHandles.html<図1>を開いています。次に開いたインスタンスウインドウから各サイトへ複数の新規ウインドウ開いています。次にそれぞれのウインドウハンドルを取得し、ウインドウハンドルをswitchTo.window(xxx)で指定することで個別のウインドウ制御を可能にしています。
説明
◆メソッド ・java.util.Set<java.lang.String> getWindowHandles() ◆使用形態 ・driver.getWindowHandles() ◆備考 ・指定したインスタンスのウインドウハンドル(ウインドウを識別するための管理番号) を全て取得する ◆関連項目 ・ウィンドウの位置を取得する ・ウィンドウのサイズを取得する
サンプル
import java.util.Iterator; import java.util.Set; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class WebTest{ public static void main(String[] args){ //Chrome制御のためChromeDriverのパスを指定 System.setProperty("webdriver.chrome.driver", "D:\\AutoTest\\chromedriver.exe"); //Chromeを起動する WebDriver driver = new ChromeDriver(); //指定したURLに遷移する<図1> driver.get("file://D:/AutoTest/getWindowHandles.html"); //それぞれのテキスト名のリンク要素を取得 WebElement link1 = driver.findElement(By.linkText("Yahoo Top")); WebElement link2 = driver.findElement(By.linkText("Firefox Top")); WebElement link3 = driver.findElement(By.linkText("Opera Top")); //少々待機する try{ Thread.sleep(3000); }catch (InterruptedException e){ } //ローカルファイル内のYahooへのリンクをクリックし新規ウィンドウを立ち上げる link1.click(); //ローカルファイル内のFirefoxへのリンクをクリックし新規ウィンドウを立ち上げる link2.click(); //ローカルファイル内のOperaへのリンクをクリックし新規ウィンドウを立ち上げる link3.click(); //少々待機する try{ Thread.sleep(5000); }catch (InterruptedException e){ } //全てのウィンドウハンドルを取得 Set<String> set = driver.getWindowHandles(); //それぞれのウインドウハンドルを別々の変数に保存 Iterator<String> it = set.iterator(); //ウィンドウハンドル1 String window1 = it.next(); System.out.println(window1); //ウィンドウハンドル2 String window2 = it.next(); System.out.println(window2); //ウィンドウハンドル3 String window3 = it.next(); System.out.println(window3); //ウィンドウハンドル4 String window4 = it.next(); System.out.println(window4); //getWindowHandles.htmlの内容からMSNページへ移行した driver.switchTo().window(window1).get("https://www.msn.com"); //OperaページからGoogleページへ移行した driver.switchTo().window(window2).get("https://www.google.com"); //FirefoxページからMicrosoftページへ移行した driver.switchTo().window(window3).get("https://www.microsoft.com"); } }
※selenium version 4.1.4で動作確認をしています(ブラウザのUIや属性値などが変更された場合、実行結果が異なる可能性があります)
実行結果
getWindowHandles.html<図1>
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>SeleniumTest</title> </head> <body> <div> <a href="https://www.yahoo.co.jp/" target="YAHOO">Yahoo Top</a> </div> <div> <a href="https://www.firefox.com/" target="FIREFOX">Firefox Top</a> </div> <div> <a href="https://www.opera.com/ja" target="OPERA">Opera Top</a> </div> </body> </html>
動画デモ
※字幕をONにすると解説のテロップが表示されます※