【问题标题】:How to switch to another Tab using Selenium WebDriver with Java如何使用 Selenium WebDriver 和 Java 切换到另一个选项卡
【发布时间】:2015-06-09 21:51:58
【问题描述】:

我正在打开 google.com,然后单击“GMail”超链接,会在同一浏览器上打开一个新选项卡。

现在我想切换到使用 Selenium WebDriver 打开 GMail 的新标签页。

代码sn-p是:

  WebDriver wd = new ChromeDriver();
  wd.get("https://www.google.co.in/?gws_rd=ssl");       
  wd.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTROL,Keys.RETURN);

现在我想转到打开 GMail 链接的选项卡。我用谷歌搜索了 N 种解决方案,但都没有奏效。

例如

解决方案 1:

String Tab1 = wd.getWindowHandle(); 
ArrayList<String> availableWindows = new ArrayList<String>(wd.getWindowHandles()); 
if (!availableWindows.isEmpty()) { 
wd.switchTo().window(availableWindows.get(1)); 
}

解决方案 2:

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");

请推荐。我被困在这个问题上。

【问题讨论】:

    标签: java selenium-webdriver


    【解决方案1】:

    在我看来 driver.getWindowHandles() 不适用于选项卡...您总是会返回一个带有当前选项卡句柄的单项数组... [删除旧答案,因为这似乎现在已修复]

    更新(2016 年 6 月 16 日):当前版本的 Selenium(服务器独立 2.53.0)似乎表现不同。现在我正在使用这样的东西来打开/切换驱动程序到新标签:

    更新(2016 年 11 月 16 日):Selenium 3.0.1 似乎又改变了一些事情?我现在必须使用 javascript 打开一个新标签。这似乎只在 Chrome 中有效...... Firefox 会打开一个新窗口。我将看看是否可以使用 geckodriver 的设置(功能/配置文件?)更改该行为。

    // Actions actions = new Actions(driver); 
    // actions.keyDown(Keys.CONTROL).sendKeys("t").keyUp(Keys.CONTROL).build().perform();
    
    ((JavascriptExecutor)driver).executeScript("window.open('about:blank', '_blank');");
    
    Set<String> tab_handles = driver.getWindowHandles();
        int number_of_tabs = tab_handles.size();
        int new_tab_index = number_of_tabs-1;
        driver.switchTo().window(tab_handles.toArray()[new_tab_index].toString()); 
    

    getWindowHandles() 方法现在返回一个 Set。到目前为止,这仅在 Chrome 中进行了测试,因为 Firefox 版本 47 目前在使用 firefoxdriver 时存在一些严重问题......并且使用 geckodriver 操作根本不起作用。 [2016 年 6 月 11 日更新]:Firefox 通过 geckodriver 现在返回一个 Set]

    您也可以这样做.. 将其转换为 ArrayList:

      //  set tab_index to the number of window/tab you want.  0 is the first tab 
    
           ArrayList<String> tabs_windows = new ArrayList<String> (driver.getWindowHandles());
        driver.switchTo().window(tabs_windows.get(tab_index));
    

    更新:为了解决 geckodriver 错误,我已切换到使用 element.sendkeys ......这样的东西似乎在 Marionette 和 Chrome 中工作。(更新 2):由于 Selenium 3.0 的变化而更新为 javascript。 1:

    // driver.findElement(By.cssSelector("body")).sendKeys(Keys.chord(Keys.CONTROL, "t"));
    
    ((JavascriptExecutor)driver).executeScript("window.open('about:blank', '_blank');");
    
        Set<String> tab_handles = driver.getWindowHandles();
        int number_of_tabs = tab_handles.size();
        int new_tab_index = number_of_tabs-1;
        driver.switchTo().window(tab_handles.toArray()[new_tab_index].toString()); 
    

    更新(2016 年 11 月 16 日):使用 Ctrl-W 关闭的旧方法似乎也被破坏了......使用这个:

    ((JavascriptExecutor)driver).executeScript("close();");
    

    【讨论】:

      【解决方案2】:

      我们手动切换到下一个标签的方式是按 - CTRL + Page Down 我们可以像使用 Selenium 一样 -

      driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL, Keys.PAGE_DOWN);
      

      【讨论】:

        【解决方案3】:

        窗口句柄对索引号不是很安全,因为它们可能非常无序。我建议您找到一个列表并进行循环并查找预期的列表。

        public void TabHandles() {
            driver.get("https://www.google.co.in/?gws_rd=ssl");
        
            String currentWindowHandle = driver.getWindowHandle();
        
            driver.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTROL, Keys.RETURN);
        
            //Get the list of all window handles
            ArrayList<String> windowHandles = new ArrayList<String>(driver.getWindowHandles());
        
            for (String window:windowHandles){
        
                //if it contains the current window we want to eliminate that from switchTo();
                if (!window.equals(currentWindowHandle){
                    //Now switchTo new Tab.
                    driver.switchTo().window(window);
                    //Do whatever you want to do here.
                    
                    //Close the newly opened tab
                    driver.close();
                }
            }
        }
        

        【讨论】:

        • @vikramvi 请提供我堆栈跟踪哦失败。不知道你的意思是不工作
        • 抱歉含糊不清,带有 2 个选项卡的单个窗口和上面的代码无法在这 2 个选项卡之间切换。没有抛出错误,但没有发生切换。
        【解决方案4】:

        您有一个可能的正确解决方案 (Sol2),但问题是您无法切换到新标签,直到它无法完全加载。

        所以,解决方案: 1) BAD ONE: 放入等待计时器,只需 sleep(2000) 一段时间,然后

        driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
        

        2) 不错!

        使用原生硒的东西。首先打开所有可用的标签:

        driver.getWindowHandle();
        

        然后切换到另一个标签:

        driver.switchTo().window(myWindowHandle );
        

        【讨论】:

          【解决方案5】:

          您可以提供选项卡名称参数并尝试以下操作:

          public boolean switchToTab(String tabName){
              log.debug("Switch to {} tab",tabName);
              ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
              ArrayList<String> tabList = new ArrayList<>();
              for (int i =0;i<tab.size();i++){
                  tabList.add(i,driver.switchTo().window(tab.get(i)).getTitle());
                  driver.switchTo().window(tab.get(0));
                  if(tabList.get(i).equals(tabName)){
                      driver.switchTo().window(tab.get(i));
                          return true;
                  }
              }
              return false;
          }
          

          【讨论】:

            【解决方案6】:

            有一个简单快捷的方法:

            import java.util.ArrayList;
            
            ArrayList<String> tabs2 = new ArrayList<String>(driver.getWindowHandles());
            driver.switchTo().window(tabs2.get(1)); //Tab number
            
            //Can change it for next tab like that or previous:
            
            driver.switchTo().window(tabs2.get(1));
            driver.close();
            driver.switchTo().window(tabs2.get(0));
            

            就是这样,希望对你有帮助。

            【讨论】:

              【解决方案7】:

              我建议初始化第二个驱动程序来完成该选项卡的工作,或者在第一个驱动程序中打开第二个选项卡并让该选项卡有自己的一组逻辑来完成您需要的工作。

              下面的代码应该让您很好地了解如何使用 Selenium 2.53.1 和 Chrome 51.0 在每个驱动程序中操作不同的驱动程序/浏览器/窗口和多个选项卡。

              // INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
              driver1 = new ChromeDriver();
              driver2 = new ChromeDriver();
              
              // LOOP TO OPEN AS MANY TABS AS YOU WISH
              for(int i = 0; i < TAB_NUMBER; i++) {
                 driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
                 // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
                 Thread.sleep(100);
              
              // STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
              ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());
              
              // REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)
              
              // LOOP TO OPEN AS MANY TABS AS YOU WISH
              for(int i = 0; i < TAB_NUMBER; i++) {
                 driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
                 // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
                 Thread.sleep(100);
              
              // STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
              ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());
              
              // NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
              for(int ii = 0; ii <= TAB_NUMBER; ii++) {
                 driver1.switchTo().window(tabs1.get(ii));
                 // LOGIC FOR THAT DRIVER'S CURRENT TAB
              }
              
               // PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
               for(int ii = 0; ii <= TAB_NUMBER; ii++) {
                  drvier2.switchTo().window(tabs2.get(ii));
                  // LOGIC FOR THAT DRIVER'S CURRENT TAB
               }
              

              希望对你有帮助

              【讨论】:

                【解决方案8】:

                以下是使用机器人类的 Java 实现,我已经多次切换标签 (7) 次。

                我希望它会有所帮助。

                进口:

                导入 java.awt.Robot;

                导入 java.awt.event.KeyEvent;

                导入 java.util.ArrayList;

                导入 org.openqa.selenium.WebDriver;

                导入 org.openqa.selenium.chrome.ChromeDriver;

                主要方法

                public static void main(String[] args) {
                
                    System.setProperty("webdriver.chrome.driver", "/Path/To/chromedriver/" + "chromedriver.exe");
                    WebDriver driver = new ChromeDriver();
                
                    // go to URL1
                    driver.navigate().to("http://www.facebook.com");
                    try {
                        // Open New Tab by simulating Ctrl+t
                        Robot r = new Robot();
                        r.keyPress(KeyEvent.VK_CONTROL);
                        r.keyPress(KeyEvent.VK_T);
                        r.keyRelease(KeyEvent.VK_CONTROL);
                        r.keyRelease(KeyEvent.VK_T);
                        Thread.sleep(1000);
                
                        // Create Array List to keep Tab information
                        ArrayList<String> tabs2 = new ArrayList<String>(driver.getWindowHandles());
                
                        // Navigate to New Tab
                        driver.switchTo().window(tabs2.get(1));
                
                        // go to URL2
                        driver.navigate().to("http://www.google.com");
                
                        // Navigate to Tab 0
                        driver.switchTo().window(tabs2.get(0));
                
                        Thread.sleep(2000);
                        // Navigate to Tab 1
                        driver.switchTo().window(tabs2.get(1));
                
                        Thread.sleep(2000);
                        // Navigate to Tab 0
                        driver.switchTo().window(tabs2.get(0));
                
                        Thread.sleep(2000);
                        // Navigate to Tab 1
                        driver.switchTo().window(tabs2.get(1));
                
                        Thread.sleep(2000);
                        // Navigate to Tab 1
                        driver.switchTo().window(tabs2.get(0));
                        driver.close();
                
                        Thread.sleep(2000);
                
                        // Navigate to Tab 1
                        driver.switchTo().window(tabs2.get(1));
                        driver.close();
                
                    } catch (Exception e) {
                    }
                
                }
                

                【讨论】:

                  猜你喜欢
                  • 2012-09-25
                  • 2018-12-15
                  • 2020-09-16
                  • 2014-10-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-02-12
                  • 2018-11-23
                  相关资源
                  最近更新 更多