Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何切换到单击按钮后打开的新浏览器窗口?_Java_Selenium_Selenium Webdriver_Webdriver_New Window - Fatal编程技术网

Java 如何切换到单击按钮后打开的新浏览器窗口?

Java 如何切换到单击按钮后打开的新浏览器窗口?,java,selenium,selenium-webdriver,webdriver,new-window,Java,Selenium,Selenium Webdriver,Webdriver,New Window,我有这样的情况,当点击按钮打开新的浏览器窗口时,会显示搜索结果 有没有办法连接并聚焦到新打开的浏览器窗口? 并使用它,然后返回原始(第一个)窗口。您可以使用: driver.SwitchTo().Window(WindowName); 其中WindowName是一个字符串,表示要将焦点切换到的窗口的名称。使用原始窗口的名称再次调用此函数,完成后返回。您可以按如下方式在窗口之间切换: // Store the current window handle String winHandleBefor

我有这样的情况,当点击按钮打开新的浏览器窗口时,会显示搜索结果

有没有办法连接并聚焦到新打开的浏览器窗口?

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

您可以使用:

driver.SwitchTo().Window(WindowName);

其中WindowName是一个字符串,表示要将焦点切换到的窗口的名称。使用原始窗口的名称再次调用此函数,完成后返回。

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

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

我使用迭代器和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);
            }
//单击您的链接
findElement(By.xpath(“xpath”)).click();
//获取集合中的所有窗口句柄
Set handles=driver.getWindowHandles();
迭代器it=handles.Iterator();
//遍历你的窗口
while(it.hasNext()){
字符串parent=it.next();
字符串newwin=it.next();
driver.switchTo()窗口(newwin);
//在新窗口上执行操作
driver.close();
driver.switchTo()窗口(父窗口);
}

苏里亚,你的方式行不通,原因有两个:

  • 您不能在测试评估期间关闭驱动程序,因为在切换到活动元素之前,它将失去焦点,并且您不会得到任何窗口异常
  • 若测试是在ChromeDriver上运行的,你们将不会看到一个窗口,而是在你们的应用程序中点击标签。由于SeleniumDriver不能与选项卡一起操作,只能在窗口之间切换,它挂起在打开新选项卡的位置,并在超时时崩溃
    只是为了增加内容

    返回主窗口(默认窗口)


    使用
    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
              }
           }
    
    String parentWindow=driver.getWindowHandle();
    Set handles=driver.getWindowHandles();
    用于(字符串windowHandle:handles)
    {
    如果(!windowHandle.equals(parentWindow))
    {
    driver.switchTo().window(windowHandle);
    driver.close();//关闭子窗口
    driver.switchTo().window(parentWindow);//cntrl到父窗口
    }
    }
    
    如果您有多个浏览器(使用java 8)

    import java.util.HashSet;
    导入java.util.List;
    导入java.util.Set;
    导入java.util.stream.collector;
    导入org.openqa.selenium.By;
    导入org.openqa.selenium.WebDriver;
    导入org.openqa.selenium.firefox.FirefoxDriver;
    公共类TestLink{
    私有静态设置窗口;
    公共静态void main(字符串[]args){
    WebDriver=newfirefoxdriver();
    驱动程序。获取(“file:///C:/Users/radler/Desktop/myLink.html");
    设置窗口(驱动程序);
    driver.findElement(By.xpath(“//body/a”)。单击();
    //获取新窗口
    字符串newWindow=getWindow(驱动程序);
    driver.switchTo().window(newWindow);
    //在新窗口上执行操作
    String text=driver.findelelement(By.cssSelector(“.active”).getText();
    System.out.println(文本);
    driver.close();
    //调回
    driver.switchTo().window(windows.iterator().next());
    driver.findElement(By.xpath(“//body/a”)。单击();
    }
    私有静态void setWindows(WebDriver驱动程序){
    windows=新的HashSet();
    driver.getWindowHandles().stream().forEach(n->windows.add(n));
    }
    私有静态字符串getWindow(WebDriver驱动程序){
    List newWindow=driver.getWindowHandles().stream()
    .filter(n->windows.contains(n)=false).collect(collector.toList());
    System.out.println(newWindow.get(0));
    返回newWindow.get(0);
    }
    }
    
    修改IE的注册表:

  • HKEY\U当前\U用户\Software\Microsoft\Internet Explorer\Main
  • 右击→ 新的→ 字符串值→ 值名称:TabProcGrowth(如果不存在,则创建)
  • TabProcGrowth(右键单击)→ 修改→ 价值数据:0
  • 来源:

    就我而言,IE在注册表编辑后开始检测新的窗口句柄

    摘自MSDN博客: 选项卡进程增长:设置IE创建新选项卡进程的速率

    “最大数量”算法:指定在特定强制完整性级别(MIC)下,单个帧进程的单个隔离会话可执行的最大tab进程数。相对值为:

    • TabProcGrowth=0:选项卡和框架在同一进程中运行;各话筒级别的帧不统一
    • TabProcGrowth=1:给定帧进程的所有制表符在给定麦克风级别的单个制表符进程中运行
    来源:


    互联网选项:
    • 保安→ 取消勾选所有区域(互联网、, 本地intranet、受信任站点、受限制站点)
    • 先进的→ 安全→ 取消勾选启用增强保护模式

    代码: 浏览器:IE11 x64(缩放:100%)
    OS:Windows7x64
    硒:3.5.1
    WebDriver:IEDriverServer x64 3.5.1

    publicstaticstringopenwindow(WebDriver-driver,By)抛出IOException{
    字符串parentHandle=driver.getWindowHandle();//保存父窗口
    WebElement clickableElement=driver.findElement(按);
    clickableElement.click();//打开子窗口
    WebDriverWait wait=新的WebDriverWait(驱动程序,10);//10秒内超时
    布尔值isChildWindowOpen=wait.until(ExpectedConditions.numberOfWindowsToBe(2));
    如果(正在打开){
    Set handles=driver.getWindowHandles();
    //切换到子窗口
    for(字符串句柄:句柄){
    driver.switchTo().窗口(手柄);
    如果(!parentHandle.equals(handle)){
    打破
    }
    }
    driver.manage().window().maximize();
    }
    return parentHandle;//如果需要切换回父窗口,则返回父窗口
    }
    /*如何使用我
    
    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);
      }
    
    }
    
    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);
    
     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);
                }
    
     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();
    }