web-dev-qa-db-ja.com

ボタンをクリックすると開く新しいブラウザウィンドウに切り替える方法

ボタンをクリックすると、新しいブラウザウィンドウが開き、検索結果が表示されます。

新しく開いたブラウザウィンドウに接続してフォーカスする方法はありますか?

そして、それを使って、元の(最初の)ウィンドウに戻ります。

以下のようにウィンドウを切り替えることができます。

// Store the current window handle
String winHandleBefore = driver.getWindowHandle();

// Perform the click operation that opens new window

// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
}

// Perform the actions on new window

// Close the new window, if that window no more required
driver.close();

// Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);

// Continue with original browser (first window)
97
Surya

コンテンツに追加するだけで...

メインウィンドウ(デフォルトウィンドウ)に戻るには.

driver.switchTo().defaultContent();を使用します

12
Amarnath Rayudu

このスクリプトは、親ウィンドウから子ウィンドウに切り替え、cntrlを親ウィンドウに戻すのに役立ちます

String parentWindow = driver.getWindowHandle();
Set<String> handles =  driver.getWindowHandles();
   for(String windowHandle  : handles)
       {
       if(!windowHandle.equals(parentWindow))
          {
          driver.switchTo().window(windowHandle);
         <!--Perform your operation here for new window-->
         driver.close(); //closing child window
         driver.switchTo().window(parentWindow); //cntrl to parent window
          }
       }
11
Prashanth Sams

Surya、あなたのやり方はうまくいきません。理由は2つあります:

  1. アクティブ要素に切り替える前に、テストの評価中にフォーカスを失うとしてドライバーを閉じることはできず、NoSuchWindowExceptionが発生します。
  2. テストをChromeDriverで実行すると、ウィンドウではなく、アプリケーションのクリック時にタブが表示されます。 SeleniumDriverはタブでは動作できませんのように、ウィンドウ間でのみ切り替え、新しいタブが開いている場所をクリックするとハングし、タイムアウトするとクラッシュします。
4
Invy

IEのレジストリを変更します。

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
  2. 右クリック→新規→文字列値→値名:TabProcGrowth(存在しない場合は作成)
  3. TabProcGrowth(右クリック)→変更...→値データ:0

出典:Internet Explorer 8-10でのSelenium WebDriverウィンドウ切り替えの問題

私の場合、IEはレジストリの編集後に新しいウィンドウハンドルの検出を開始しました。

MSDNブログからの抜粋:

Tab Process Growth:IEが新しいタブプロセスを作成する速度を設定します。

「最大数」アルゴリズム:これは、特定の必須整合性レベル(MIC)で、単一のフレームプロセスの単一の分離セッションに対して実行できるタブプロセスの最大数を指定します。相対値は次のとおりです。

  • TabProcGrowth = 0:タブとフレームは同じプロセス内で実行されます。フレームはMICレベルで統一されていません。
  • TabProcGrowth = 1:特定のフレームプロセスのすべてのタブは、特定のMICレベルの単一タブプロセスで実行されます。

ソース:Internet Explorer 8.0で新しいタブを開くと新しいプロセスが起動する場合があります


インターネット設定:

  • セキュリティ→選択解除すべてのゾーン(インターネット、ローカルイントラネット、信頼済みサイト、制限付きサイト)で保護モードを有効にします
  • 詳細設定→セキュリティ→チェックを外す拡張保護モードを有効にする

コード:

ブラウザ:IE11 x64(ズーム:100%)
OS:Windows 7 x64
セレン:3.5.1
WebDriver:IEDriverServer x64 3.5.1

public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle(); // Save parent window
WebElement clickableElement = driver.findElement(by);
clickableElement.click(); // Open child window
WebDriverWait wait = new WebDriverWait(driver, 10); // Timeout in 10s
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
    Set<String> handles = driver.getWindowHandles();
    // Switch to child window
    for (String handle : handles) {
        driver.switchTo().window(handle);
        if (!parentHandle.equals(handle)) {
            break;
        }
    }
    driver.manage().window().maximize();
}
return parentHandle; // Returns parent window if need to switch back
}



/* How to use method */
String parentHandle = Selenium.openWindow(driver, by);

// Do things in child window
driver.close();

// Return to parent window
driver.switchTo().window(parentHandle);

上記のコードには、 Set<T>にJavaでの順序が保証されていない として親ウィンドウに切り替えないことを確認するif-checkが含まれています。 WebDriverWaitは、以下のステートメントでサポートされているように、成功の可能性を高めるようです。

Luke Inman-Semera :(Seleniumの開発者)からの引用

ブラウザは新しいウィンドウを確認するのに時間がかかり、ポップアップウィンドウが表示される前にswitchTo()ループに陥ることがあります。

GetWindowHandles()によって返された最後のウィンドウが最後に開かれたウィンドウであると自動的に仮定します。必ずしも順序どおりに返されるとは限らないため、必ずしもそうとは限りません。

Source:IEでポップアップを処理できない、コントロールがポップアップウィンドウに転送されない


関連記事:

2
silver

次を使用できます。

driver.SwitchTo().Window(WindowName);

WindowNameは、フォーカスを切り替えるウィンドウの名前を表す文字列です。元のウィンドウの名前でこの関数を再度呼び出して、完了したら元のウィンドウに戻ります。

2
Breeze91

イテレータとwhileループを使用して、さまざまなウィンドウハンドルを保存してから、前後に切り替えます。

//Click your link
driver.findElement(By.xpath("xpath")).click();
//Get all the window handles in a set
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);
//perform actions on new window
driver.close();
driver.switchTo().window(parent);
            }
2
StatusQuo

そのため、これらの多くのソリューションの問題は、ウィンドウが即座に表示されることを前提としていることです(IEでは、すぐに何も起こらず、大幅に少なくなります)。また、要素をクリックする前にウィンドウが1つだけになると想定していますが、常にそうであるとは限りません。また、IEは、予測可能な順序でウィンドウハンドルを返しません。だから私は次のことをするだろう。

 public String clickAndSwitchWindow(WebElement elementToClick, Duration 
    timeToWaitForWindowToAppear) {
    Set<String> priorHandles = _driver.getWindowHandles();

    elementToClick.click();
    try {
        new WebDriverWait(_driver,
                timeToWaitForWindowToAppear.getSeconds()).until(
                d -> {
                    Set<String> newHandles = d.getWindowHandles();
                    if (newHandles.size() > priorHandles.size()) {
                        for (String newHandle : newHandles) {
                            if (!priorHandles.contains(newHandle)) {
                                d.switchTo().window(newHandle);
                                return true;
                            }
                        }
                        return false;
                    } else {
                        return false;
                    }

                });
    } catch (Exception e) {
        Logging.log_AndFail("Encountered error while switching to new window after clicking element " + elementToClick.toString()
                + " seeing error: \n" + e.getMessage());
    }

    return _driver.getWindowHandle();
}
 main you can do :

 String mainTab = page.goToNewTab ();
 //do what you want
 page.backToMainPage(mainTab);  

 What you need to have in order to use the main   

        private static Set<String> windows;

            //get all open windows 
            //return current window
            public String initWindows() {
                windows = new HashSet<String>();
                driver.getWindowHandles().stream().forEach(n ->   windows.add(n));
                return driver.getWindowHandle();
            }

            public String getNewWindow() {
                List<String> newWindow = driver.getWindowHandles().stream().filter(n -> windows.contains(n) == false)
                        .collect(Collectors.toList());
                logger.info(newWindow.get(0));
                return newWindow.get(0);
            }


            public String goToNewTab() {
                String startWindow = driver.initWindows();
                driver.findElement(By.cssSelector("XX")).click();
                String newWindow = driver.getNewWindow();
                driver.switchTo().window(newWindow);
                return startWindow;
            }

            public void backToMainPage(String startWindow) {
                driver.close();
                driver.switchTo().window(startWindow);
            }
0
Ran Adler