前提:Internet Explorer 11, Windows 7, Selenium WebDriver 2.53.0
注意:ローカルイントラネットの話なので、会社の環境によって以下の内容が常に真になるか不明。
ローカルイントラネットでInternet Explorer11を使うという日本の業務システムにありがちな構成でSelenium WebDriverを動かしたとき、window.openで開いた子画面がSeleniumで取得できないという問題にあたった。
window.openで開く箇所は以下のようになっている。
<script>
var childWindowProp = {
width : 805
,height : 580
,createOptions : function() {
return "scrollbars=yes,resizable=no,width=" + this.width + ",height=" + this.height + ",top=" + ((screen.height - this.height) / 2) + ",left=" + ((screen.width - this.width) / 2);
}
};
</script>
<a href="javascript:void(0)" onclick="window.open('/child_window_url', 'child_window_name', childWindowProp.createOptions());return false;">子画面を開く</a>
Selenium WebDriverで子画面を取得する箇所は以下のようになっている。
public class ChildWindow {
protected WebDriver driver;
private String parentWindowId;
private String childWindowId;
public ChildWindow(WebDriver driver) {
this.driver = driver;
this.parentWindowId = driver.getWindowHandle();
int maxRetry = 5;
while (childWindowId == null && maxRetry > 0) {
maxRetry--;
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
for (String windowId : driver.getWindowHandles()) {
if (!windowId.equals(parentWindowId)) {
this.childWindowId = windowId;
}
}
}
driver.switchTo().window(childWindowId);
}
}
同Webシステムをインターネット経由で利用したときには driver.getWindowHandles()
で親画面と子画面の二つのwindowHanleが必ず取得できたが、イントラネット経由で利用したときには親画面のwindowHandleしか取得できなかった。
インターネットとイントラネットでのIE11の設定の違いが原因だろうと当たりをつけて、「インターネットオプション」の「セキュリティ」タブでインターネットとイントラネットの違いを確認した。
「このゾーンのセキュリティのレベル」欄の「保護モードを有効にする」項目でインターネットの場合はチェックがついているが、イントラネットの場合はチェックがついていなかったため、イントラネットでもチェックをつけてからSeleniumを実行した。
結果はイントラネットでもうまく動くようになり成功だったが、「保護モードを有効にする」の意味を深く理解できていないので根本原因は分からなかった。