2

JavascriptExecutor を使用して、Selenium webdriver から IE9 で新しいタブを開こうとしています:

public void openTab() {
    String url = webDriver.getCurrentUrl();
    String script = "var     a=document.createElement('a');a.target='_blank';a.href='" + url + "';a.innerHTML='open';document.body.appendChild(a);return a";
    Object element = getJSExecutor().executeScript(script);
    if (element instanceof WebElement) {
        WebElement anchor = (WebElement) element;
        anchor.click();
    } else {
        throw new RuntimeException("Unable to open tab: " + url);
    }
}

これは Chrome では問題なく動作しますが、IE9 で実行すると、次のエラーが発生します。

ElementNotVisibleException: ドライバーが要素をクリックしようとしているポイントがビューポートにスクロールされませんでした。

私はセレンと IEDriverServer の両方の 2.31 バージョンを使用しています。

4

2 に答える 2

3

ビューポートの問題を解決し、IEDriverServer が両方のウィンドウと適切にやり取りできるようにしました。

ビューポートの問題を解決するために、Actions を使用して moveToElement を実行し、次にクリックします。

public void actionsClick(WebElement element){
    Actions builder = new Actions(webDriver);
    builder.moveToElement(element).click(element).perform();
}

IEDriverServer がすべてのウィンドウ ハンドルを取得するのに少し時間がかかるように見えるので、クリックを行った後、openTab メソッドに 5 秒間の待機を追加しました。

public void openTab() {
    String url = webDriver.getCurrentUrl();
    String script = "var a=document.createElement('a');a.target='_blank';a.href='" + url + "';a.innerHTML='open me in a new tab';document.body.appendChild(a);return a";
    Object element = getJSExecutor().executeScript(script);
    if (element instanceof WebElement) {
        WebElement anchor = (WebElement) element;
        actionsClick(anchor);
        waitFor(5000);
        switchBrowserTab();
        returnToPreviousBrowserTab();
    } else {
        throw new RuntimeException("Unable to open tab: " + url);
    }
}

次に、上記の方法で示したように、IEDriverServer が両方のウィンドウ/タブを認識し、それらの間を移動できるようにするために、クリックして待機した後に switchBrowserTab() メソッドと returnToPreviousBrowserTab() メソッドを追加しました。JavascriptExecutor を使用して新しいタブを開くと、元のタブにフォーカスが残り、このメソッドは再びそこにフォーカスを戻して終了するように設定されています。以前にウィンドウ ハンドルを使用したことがない人のために、新しく開いたタブに切り替えるために使用している方法を次に示します。

    Set<String> handles = webDriver.getWindowHandles();
    List<String> handlesList = new ArrayList<String>();
    for (String handle : handles) {
        handlesList.add(handle);
    }
    webDriver.switchTo().window(handlesList.get(handlesList.size() - 1));
    webDriver.manage().window().maximize();

現在のハンドルを取得し、リストをループしてその位置を見つけ、そこから -1 のハンドルに移動することを除いて、同様のアプローチを使用して戻ります。

これが役に立てば幸いです。

編集: これは IE9 と Chrome で動作します。他のブラウザではテストされていません。

于 2013-03-07T13:53:36.077 に答える