93

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

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

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

4

11 に答える 11

127

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

// 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)
于 2012-03-07T07:59:41.630 に答える
13

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

メインウィンドウ(デフォルトウィンドウ)に戻ります。

使用するdriver.switchTo().defaultContent();

于 2013-01-22T09:03:17.297 に答える
12

このスクリプトは、親ウィンドウから子ウィンドウに切り替えて、 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
          }
       }
于 2013-06-24T12:26:57.287 に答える
3

スーリヤ、2つの理由であなたのやり方はうまくいきません:

  1. テストの評価中にドライバーを閉じることはできません。アクティブな要素に切り替える前にフォーカスが失われるため、NoSuchWindowExceptionが発生します。
  2. テストをChromeDriverで実行すると、ウィンドウは表示されませんが、アプリケーションでタブをクリックします。SeleniumDriverはタブを操作できず、ウィンドウを切り替えるだけなので、新しいタブが開いている場所をクリックするとハングし、タイムアウト時にクラッシュします。
于 2012-07-31T10:20:54.267 に答える
3

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

ie_x64_tabprocgrowth.png

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

出典: InternetExplorer8-10でのSeleniumWebDriverウィンドウの切り替えの問題

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

MSDNブログからの抜粋:

タブプロセスの増加: IEが新しいタブプロセスを作成する速度を設定します。

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

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

出典:[ 新しい]タブを開くと、InternetExplorer8.0で新しいプロセスが起動する場合があります


インターネット設定:

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

コード:

ブラウザ: IE11 x64(ズーム:100%)
OS: Windows 7 x64
Selenium: 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-Semerauからの引用:(Seleniumの開発者)

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

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

ソース: IEでポップアップを処理できません、コントロールがポップアップウィンドウに転送されていません


関連記事:

于 2017-08-13T14:07:30.133 に答える
2

あなたが使用することができます:

driver.SwitchTo().Window(WindowName);

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

于 2012-03-06T19:38:08.603 に答える
2

イテレータと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);
            }
于 2012-06-01T21:28:08.313 に答える
0
 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);
            }
于 2018-01-10T09:09:25.213 に答える
0

したがって、これらのソリューションの多くに伴う問題は、ウィンドウが即座に表示されると想定していることです(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();
}
于 2018-05-27T02:03:45.367 に答える
0

この機能は、Selenium4以降のバージョンで機能します。

// Opens a new tab and switches to new tab
driver.switchTo().newWindow(WindowType.TAB);

// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.WINDOW);
于 2021-11-09T05:51:56.403 に答える
-1

複数のブラウザを使用している場合(Java 8を使用)

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class TestLink {

  private static Set<String> windows;

  public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver();
    driver.get("file:///C:/Users/radler/Desktop/myLink.html");
    setWindows(driver);
    driver.findElement(By.xpath("//body/a")).click();
    // get new window
    String newWindow = getWindow(driver);
    driver.switchTo().window(newWindow);

    // Perform the actions on new window
    String text = driver.findElement(By.cssSelector(".active")).getText();
    System.out.println(text);

    driver.close();
    // Switch back
    driver.switchTo().window(windows.iterator().next());


    driver.findElement(By.xpath("//body/a")).click();

  }

  private static void setWindows(WebDriver driver) {
    windows = new HashSet<String>();
    driver.getWindowHandles().stream().forEach(n -> windows.add(n));
  }

  private static String getWindow(WebDriver driver) {
    List<String> newWindow = driver.getWindowHandles().stream()
        .filter(n -> windows.contains(n) == false).collect(Collectors.toList());
    System.out.println(newWindow.get(0));
    return newWindow.get(0);
  }

}
于 2014-10-06T12:08:20.263 に答える