前提:Internet Explorer11, Windows7, Selenium WebDriver2.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を実行した。
結果はイントラネットでもうまく動くようになり成功だったが、「保護モードを有効にする」の意味を深く理解できていないので根本原因は分からなかった。