如何使用SeleniumWebDriver和Java切换到另一个选项卡

如何使用SeleniumWebDriver和Java切换到另一个选项卡,java,selenium-webdriver,Java,Selenium Webdriver,我打开google.com,然后点击“GMail”超链接,在同一浏览器上打开一个新标签 现在我想切换到这个新的标签页,其中GMail是使用SeleniumWebDriver打开的 代码片段是: WebDriver wd = new ChromeDriver(); wd.get("https://www.google.co.in/?gws_rd=ssl"); wd.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTRO

我打开google.com,然后点击“GMail”超链接,在同一浏览器上打开一个新标签

现在我想切换到这个新的标签页,其中GMail是使用SeleniumWebDriver打开的

代码片段是:

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

请建议。我被这个问题困住了。

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

因此,解决方案: 1) 坏的一个:设置一个等待计时器,只需睡眠(2000)一段时间,然后

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

使用天然硒的东西。首先,打开所有可用的选项卡,方法是:

driver.getWindowHandle();
然后切换到另一个选项卡:

driver.switchTo().window(myWindowHandle );

窗口句柄对于索引号不是很安全,因为它们可能非常无序。我建议你找到一个列表,做一个循环,寻找想要的

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();
        }
    }
}
public void TabHandles(){
驱动程序。获取(“https://www.google.co.in/?gws_rd=ssl");
字符串currentWindowHandle=driver.getWindowHandle();
driver.findElement(By.linkText(“Gmail”)).sendKeys(Keys.CONTROL,Keys.RETURN);
//获取所有窗口句柄的列表
ArrayList windowHandles=新的ArrayList(driver.getWindowHandles());
用于(字符串窗口:windowHandles){
//如果它包含当前窗口,我们希望从switchTo()中消除该窗口;
如果(!window.equals)(currentWindowHandle){
//现在切换到新选项卡。
驱动程序.切换到().窗口(窗口);
//在这里你想做什么就做什么。
//关闭新打开的选项卡
driver.close();
}
}
}

我们手动切换到下一个选项卡的方式是按-
CTRL+Page Down
我们可以使用Selenium-like-

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

在我看来,driver.getWindowHandles()不适用于选项卡…您将始终使用当前选项卡的句柄返回一个单项目数组…[删除了旧答案,因为现在似乎已修复]

更新(2016年6月16日):当前版本的Selenium(server standalone 2.53.0)的行为似乎有所不同。现在我使用类似的方法打开/切换驱动程序到新选项卡:

更新(2016年11月16日):Selenium 3.0.1似乎又改变了一些事情?我现在必须使用javascript打开一个新选项卡。这似乎只在Chrome中起作用……Firefox打开了一个新窗口。我要看看是否可以使用geckodriver的设置(功能/配置文件?)来改变这种行为


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

下面的代码应该让您很好地了解如何使用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
 }
//初始化两个驱动程序(它们代表单独的CHROME窗口)
driver1=新的ChromeDriver();
driver2=新的ChromeDriver();
//循环打开任意多个选项卡
对于(int i=0;i对于(intii=0;ii下面是使用Robot类的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) {
    }

}
publicstaticvoidmain(字符串[]args){
System.setProperty(“webdriver.chrome.driver”,“/Path/To/chromedriver/”+“chromedriver.exe”);
WebDriver驱动程序=新的ChromeDriver();
//转到URL1
驱动程序。导航()。到(“http://www.facebook.com");
试一试{
//通过模拟Ctrl+t打开新选项卡
机器人r=新机器人();
r、 按键(KeyEvent.VK_控件);
r、 按键(KeyEvent.VK_T);
r、 keyRelease(KeyEvent.VK_控件);
r、 密钥释放(KeyEvent.VK_T);
睡眠(1000);
//创建数组列表以保留选项卡信息
ArrayList tabs2=新的ArrayList(driver.getWindowHandles());
//导航到新选项卡
driver.switchTo().window(tabs2.get(1));
//转到URL2
驱动程序。导航()。到(“http://www.google.com");
//导航到选项卡0
driver.switchTo().window(tabs2.get(0));
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(1));
《睡眠》(2000年);
//导航到选项卡0
driver.switchTo().window(tabs2.get(0));
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(1));
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(0));
driver.close();
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(1));
driver.close();
}捕获(例外e){
}
}

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

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;
}
public boolean switchToTab(字符串tabName){
// 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()); 
((JavascriptExecutor)driver).executeScript("close();");
// 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
 }
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) {
    }

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