如何使用Selenium java在浏览器中的两个窗口之间切换

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19117747/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 14:16:13  来源:igfitidea点击:

How to switch between two windows in browser using Selenium java

javatestingseleniumbrowserselenium-webdriver

提问by Prasanna

I'm working with Selenium Automation. In this, When i click a link in a current window, a new window opens. I just want to switch the control to the new window. But i can't do this.Actually the new window is an auto-generated one. That is, link will be generated dynamically.Help me friends...

我正在使用 Selenium 自动化。在此,当我单击当前窗口中的链接时,会打开一个新窗口。我只想将控件切换到新窗口。但我不能这样做。实际上,新窗口是一个自动生成的窗口。也就是说,链接将是动态生成的。帮帮我的朋友...

回答by ddavison

In an excerpt from a getting started with selenium webdriverproject on github,

在github 上的selenium webdriver项目入门的摘录中,

    /**
     * Waits for a window to appear, then switches to it.
     * @param regex Regex enabled. Url of the window, or title.
     * @return
     */
    public AutomationTest waitForWindow(String regex) {
        Set<String> windows = driver.getWindowHandles();

        for (String window : windows) {
            try {
                driver.switchTo().window(window);

                p = Pattern.compile(regex);
                m = p.matcher(driver.getCurrentUrl());

                if (m.find()) {
                    attempts = 0;
                    return switchToWindow(regex);
                }
                else {
                    // try for title
                    m = p.matcher(driver.getTitle());

                    if (m.find()) {
                        attempts = 0;
                        return switchToWindow(regex);
                    }
                }
            } catch(NoSuchWindowException e) {
                if (attempts <= MAX_ATTEMPTS) {
                    attempts++;

                    try {Thread.sleep(1);}catch(Exception x) { x.printStackTrace(); }

                    return waitForWindow(regex);
                } else {
                    fail("Window with url|title: " + regex + " did not appear after " + MAX_ATTEMPTS + " tries. Exiting.");
                }
            }
        }

        // when we reach this point, that means no window exists with that title..
        if (attempts == MAX_ATTEMPTS) {
            fail("Window with title: " + regex + " did not appear after 5 tries. Exiting.");
            return this;
        } else {
            System.out.println("#waitForWindow() : Window doesn't exist yet. [" + regex + "] Trying again. " + attempts + "/" + MAX_ATTEMPTS);
            attempts++;
            return waitForWindow(regex);
        }
    }

    /**
     * Switch's to a window that is already in existance.
     * @param regex Regex enabled. Url of the window, or title.
     * @return
     */
    public AutomationTest switchToWindow(String regex) {
        Set<String> windows = driver.getWindowHandles();

        for (String window : windows) {
            driver.switchTo().window(window);
            System.out.println(String.format("#switchToWindow() : title=%s ; url=%s",
                    driver.getTitle(),
                    driver.getCurrentUrl()));

            p = Pattern.compile(regex);
            m = p.matcher(driver.getTitle());

            if (m.find()) return this;
            else {
                m = p.matcher(driver.getCurrentUrl());
                if (m.find()) return this;
            }
        }

        fail("Could not switch to window with title / url: " + regex);
        return this;
    }

These are 2 custom functions to help you get started. Or you can check out that project from github to make your selenium projects better designed and easier.

这些是帮助您入门的 2 个自定义函数。或者您可以从 github 查看该项目,以使您的 selenium 项目设计得更好、更容易。

These functions can switch to, or wait for (if it doesn't exist) a window with a certain title / url.

这些函数可以切换到或等待(如果它不存在)具有特定标题/网址的窗口。

回答by SpartanElite

Yes this is possible. First you need to save the refrence to current window.

是的,这是可能的。首先,您需要将引用保存到当前窗口。

String parentWindow= driver.getWindowHandle();

The after having clicked the link, you need to switch to the other window.

单击链接后,您需要切换到另一个窗口。

List<String> allWindows = driver.getWindowHandles();
for(String curWindow : allWindows){
    driver.switchTo().window(curWindow);
}

This is where you perform operations on new window, finally closing it with

这是您在新窗口上执行操作的地方,最后用

driver.close();

and switch back to parent window

并切换回父窗口

driver.switchTo().window(parentWindow);

回答by Prasanna

I finally found the answer, I used the below method to switch to the new window,

我终于找到了答案,我用下面的方法切换到新窗口,

public String switchwindow(String object, String data){
        try {

        String winHandleBefore = driver.getWindowHandle();

        for(String winHandle : driver.getWindowHandles()){
            driver.switchTo().window(winHandle);
        }
        }catch(Exception e){
        return Constants.KEYWORD_FAIL+ "Unable to Switch Window" + e.getMessage();
        }
        return Constants.KEYWORD_PASS;
        }

To move to parent window, i used the following code,

要移动到父窗口,我使用了以下代码,

 public String switchwindowback(String object, String data){
            try {
                String winHandleBefore = driver.getWindowHandle();
                driver.close(); 
                //Switch back to original browser (first window)
                driver.switchTo().window(winHandleBefore);
                //continue with original browser (first window)
            }catch(Exception e){
            return Constants.KEYWORD_FAIL+ "Unable to Switch to main window" + e.getMessage();
            }
            return Constants.KEYWORD_PASS;
            }

回答by Avinash Pande

To switch between windows we have method.

要在窗口之间切换,我们有方法。

driver.switchTo().window("window name") 

To get the different windows handle, we have method.

要获得不同的窗口句柄,我们有方法。

driver.getWindowHandles()

Example:

例子:

    File file = new File("G:\Selenium\All_Jars\chromedriver.exe");
    System.setProperty("webdriver.chrome.driver",file.getAbsolutePath() );
    driver = new ChromeDriver();

    //Maximize the window
    driver.manage().window().maximize();

    driver.get("http://www.rediff.com/");

    //Get all window handles
    Set<String> allHandles = driver.getWindowHandles();

    //count the handles Here count is=2
    System.out.println("Count of windows:"+allHandles.size());      

    //Get current handle or default handle
    String currentWindowHandle = allHandles.iterator().next();
    System.out.println("currentWindow Handle"+currentWindowHandle);

    //Remove first/default Handle
    allHandles.remove(allHandles.iterator().next());

    //get the last Window Handle
    String lastHandle = allHandles.iterator().next();
    System.out.println("last window handle"+lastHandle);

    //switch to second/last window, because we know there are only two windows 1-parent window 2-other window(ad window)
driver.switchTo().window(lastHandle);
    System.out.println(driver.getTitle());
    driver.findElement(By.tagName("body")).click();

回答by vivek

      Set <String> set = driver.getWindowHandles();
      Iterator<String> it = set.iterator();
      String parentWindowId = it.next();
      String childWindowId = it.next();
      System.out.println(set);
      driver.switchTo().window(childWindowId);

回答by user

    // fetch all windows before clicking on new window link.
    Set<String> windowHandles = driver.getWindowHandles();
    // Click on link to open new window
    driver.findElement(By.tagName("a")).click();  // link to open new window

    Set<String> updatedWindowHandles = driver.getWindowHandles();
    updatedWindowHandles.removeAll(windowHandles);
    for (String window: updatedWindowHandles) {
        driver.switchTo().window(window);
    }

回答by Lishani

//to get the current/parent window

String parentWindowContact = driver.getWindowHandle();

//to switch to the new window from current/parent window

Set<String> handleswindow =driver.getWindowHandles();

for(String windowHandle : handleswindow)

{

   driver .switch To().window(windowHandle);

}

//to close the new window

driver.close();

//to switch back to the parent window

driver.switchTo().window(parentWindowContact);
          o switch back to the parent window

driver.switchTo().window(parentWindowContact);

回答by Ajeet Yadawa

Here is the best methods to switch in window using index and title. you can add in base class and use it frequently.

这是使用索引和标题在窗口中切换的最佳方法。您可以添加基类并经常使用它。

public  void switchToWindow(String windowTitle) {
    Set<String> windows = driver.getWindowHandles();
    for (String window : windows) {
        driver.switchTo().window(window);
        if (driver.getTitle().contains(windowTitle)) {
            return;
        }
    }
}




  public void switchToWindow(int index) {
    Set<String> windows = driver.getWindowHandles();
    int totalWin= windows.size();
    String winTitle = null;
    for(int i=0;i<totalWin;i++) {
        if(i==index) {
        winTitle = windows.toArray()[i].toString();
    }
    }
    driver.switchTo().window(winTitle);
    System.out.println(winTitle);
}