selenium3 webdriverでの画面遷移の方法についてのせておきます。
seleniumを使っていて困ったことが、ポップアップ画面、モーダルウィンドウ画面に遷移してからも、その画面に対して操作を指定するときでした。
ブラウザ上部に画面タイトル情報が出ているのに、なぜか画面名を上手く取得できないときがあって……
そんなときでも使える画面遷移方法を、のせておきます。
java,chromedriverでの操作です。
目次
画面数が2つのときに画面遷移してウィンドウを切り替えるコード(ウィンドウタイトルがわからなくても使える方法)
// 現在操作しているWindow IDを控える
String currentWindowId = driver.getWindowHandle();
// 画面遷移が行われる要素をクリック
driver.findElement(By.id(“button”)).click();
// ウィンドウ表示までに時間がかかると、seleniumが先走ってエラーになることがあるので、ウィンドウが増えるまでの待機処理
(new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
public Boolean apply(WebDriver d) {
return d.getWindowHandles().size() > 1;
}
});
// 増えたウィンドウIDを取得する。
String newWindowId = null;
for (String id : driver.getWindowHandles()) {
if (!id.equals(currentWindowId)) {
newWindowId = id;
}
}
// 取得したウィンドウIDを引数で指定してウィンドウを切り替える
WebDriver newWindowDriver = driver.switchTo().window(newWindowId);
画面数が2つ以上のときに画面遷移してウィンドウを切り替えるコード(ウィンドウタイトルがわからなくても使える方法)
//画面遷移が行われる要素をクリック
driver.findElement(By.id(“sub”)).click();
driver.findElement(By.id(“popup”)).click();
//現在開かれている画面のIDをリストに入れる
Set<String> windowHandles = driver.getWindowHandles();
List<String> windowsList = new ArrayList<String>();
for (Iterator<String> iterator = windowHandles.iterator(); iterator.hasNext();) {
windowsList.add(iterator.next());
}
//操作したい画面のウィンドウIDを入れる
driver.switchTo().window(windowsList.get(2));
//画面遷移が行われる要素をクリック
driver.findElement(By.id(“sub”)).click();
//操作したい画面のウィンドウIDを入れる
driver.switchTo().window(windowsList.get(1));
//画面遷移が行われる要素をクリック
driver.findElement(By.id(“main”)).click();
//操作したい画面のウィンドウIDを入れる
driver.switchTo().window(windowsList.get(0));
いずれ、もっと簡単に指定できるようになると思うのですが、こんな感じで画面遷移させてます。