如何切换到新的浏览器窗口,点击button后打开?

我有情况,点击button打开新的浏览器窗口与search结果。

有没有什么办法连接和重点新的打开的浏览器窗口?

并使用它,然后返回到原来的(第一个)窗口。

您可以在如下窗口之间切换:

// 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) 

只是添加到内容…

返回到主窗口(默认窗口)。

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

这个脚本可以帮助你从父窗口切换到子窗口并返回到父窗口

 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 } } 

我使用迭代器和一个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); } 

苏里亚,你的方式将无法正常工作,原因有两个:

  1. 在评估testing期间,您不能closures驱动程序,因为在切换到活动元素之前会失去焦点 ,您将得到NoSuchWindowExceptionexception。
  2. 如果在ChromeDriver上运行testing,您将不会看到一个窗口,而是在您的应用程序中单击。 由于SeleniumDriver不能使用制表符 ,只能在窗口之间切换 ,它会在新制表符打开的时候挂起,并在超时时崩溃。

你可以使用:

 driver.SwitchTo().Window(WindowName); 

其中,WindowName是表示要将焦点切换到的窗口的名称的string。 使用原始窗口的名称再次调用该函数,以便在完成后返回该函数。

修改IE的registry:

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
  2. 右键单击→新build→string值→数值名称:TabProcGrowth(如果不存在则创build)
  3. TabProcGrowth(右键单击)→修改…→数值数据:0

资料来源: Internet Explorer 8-10中的Selenium WebDriver窗口切换问题

对于我的情况,IE浏览器开始检测registry编辑后的新窗口句柄。

取自MSDN博客:

选项卡进程增长:设置IE创build新选项卡进程的速率。

“最大数量”algorithm:指定在特定的强制性完整性等级(MIC)下单个帧进程的单个隔离会话可以执行的最大选项卡进程数。 相对值是:

  • TabProcGrowth = 0:标签和框架在同一个进程中运行; MIC级别不统一帧。
  • TabProcGrowth = 1:给定帧进程的所有选项卡在给定MIC级别的单个选项卡进程中运行。

来源: 打开一个新标签可能启动一个新的进程与Internet Explorer 8.0


互联网选项:

  • 安全性→取消启用所有区域的保护模式 (Internet,本地Intranet,受信任的站点,受限制的站点)
  • 高级→安全→取消启用增强保护模式

码:

浏览器: IE11 x64(缩放:100%)
操作系统: Windows 7 x64
selenium: 3.5.1
WebDriver: IEDriverServer x64 3.5.1

 public static String openAndSwitchToWindow(WebDriver driver, WebElement clickableElement, long waitInMillis) throws InterruptedException { String parentHandle = driver.getWindowHandle(); // Save parent window clickableElement.click(); // Open child window Thread.sleep(waitInMillis); Set<String> handles = driver.getWindowHandles(); if (handles.size() > 1) { // Check if more than 1 window is open for (String handle : handles) { driver.switchTo().window(handle); if (!parentHandle.equals(handle)) { break; } } } return parentHandle; // Returns parent window if you want to switch back } /* How to use method */ String parentHandle = SeleniumUtil.openAndSwitchToWindow(driver, linkToChildWindow, 5000); // Do things in child window driver.manage().window().maximize(); driver.close(); // Return to parent window driver.switchTo().window(parentHandle); 

上面的代码包含一个if-check,以确保您不会切换到父窗口,因为Set<T>在Java中没有保证的顺序 。 Thread.sleep()看起来像下面的语句所支持的那样增加了成功的机会。

引自Luke Inman-Semerau (Selenium开发人员)

浏览器可能需要一些时间才能确认新窗口,并且在出现popup窗口之前,您可能正在进入switchTo()循环。

您自动假定getWindowHandles()返回的最后一个窗口将是最后一个打开的窗口。 这不一定是正确的,因为它们不能保证以任何顺序返回。

来源: 无法处理IE中的popup窗口,控件不会转移到popup窗口


相关文章:

  • selenium切换到新的选项卡在IE中
  • 如何在IE中使用selenium(Java)打开新标签,并在该标签(不是窗口)中打开一个URL

如果你有多个浏览器(使用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); } } 

我喜欢自动窗口切换的方式,我可以使用页面对象进行控制。

当有多个窗口打开时,来自该页面对象的任何方法都将在具有匹配标题的浏览器窗口上执行。

 @Window(".* some windows title goes here .*") public class ToolsQANewWindow { // your page object code } 

在这里查看详细步骤 – http://www.testautomationguru.com/selenium-webdriver-automatic-switching-between-browser-windows-using-guice-method-interceptor/