使用Selenium WebDriver和Java切换选项卡



Answers

这是打开新选项卡,将焦点更改为选项卡,关闭选项卡并将焦点返回到旧/原始选项卡的简单解决方案:

@Test
public void testTabs() {
    driver.get("https://business.twitter.com/start-advertising");
    assertStartAdvertising();

    // considering that there is only one tab opened in that point.
    String oldTab = driver.getWindowHandle();
    driver.findElement(By.linkText("Twitter Advertising Blog")).click();
    ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
    newTab.remove(oldTab);
    // change focus to new tab
    driver.switchTo().window(newTab.get(0));
    assertAdvertisingBlog();

    // Do what you want here, you are in the new tab

    driver.close();
    // change focus back to old tab
    driver.switchTo().window(oldTab);
    assertStartAdvertising();

    // Do what you want here, you are in the old tab
}

private void assertStartAdvertising() {
    assertEquals("Start Advertising | Twitter for Business", driver.getTitle());
}

private void assertAdvertisingBlog() {
    assertEquals("Twitter Advertising", driver.getTitle());
}
Question

使用Selenium WebDriver与JAVA,我试图自动化一个功能,我必须打开一个新的选项卡在那里做一些操作,并回到上一个选项卡(父)。 我使用了开关手柄,但它不起作用。 还有一个奇怪的事情是两个标签有相同的窗口句柄,因此我无法在标签之间切换。

但是,当我尝试使用不同的Firefox窗口时,它可以工作,但对于标签,它不起作用。

请帮我,我如何切换标签。 或者如何在不使用窗口句柄的情况下切换标签,因为在我的情况下,窗口句柄与两个标签相同。

(我观察到当你在同一个窗口中打开不同的标签时,窗口句柄保持不变。)




这是一个非常简单的过程:假设您有两个选项卡,因此您需要首先使用client.window(callback)关闭当前选项卡,因为switch命令“切换到第一个可用的”。 然后,您可以使用client.switchTab轻松切换选项卡。




您需要做的第一件事是打开一个新选项卡并保存它的句柄名称。 最好使用javascript而不是键(ctrl + t)来实现,因为自动化服务器上​​的密钥并不总是可用。 例:

public static String openNewTab(String url) {
    executeJavaScript("window.parent = window.open('parent');");
    ArrayList<String> tabs = new ArrayList<String>(bot.driver.getWindowHandles());
    String handleName = tabs.get(1);
    bot.driver.switchTo().window(handleName);
    System.setProperty("current.window.handle", handleName);
    bot.driver.get(url);
    return handleName;
}

您需要做的第二件事是在标签之间切换。 仅通过切换窗口句柄执行此操作并不总是有效,因为您将使用的选项卡不会始终处于焦点,Selenium将不时失败。 正如我所说,使用密钥有点问题,而javascript并不真正支持切换标签,所以我使用警报来切换标签,它就像一个魅力:

public static void switchTab(int tabNumber, String handleName) {
        driver.switchTo().window(handleName);
        System.setProperty("current.window.handle", handleName);
        if (tabNumber==1)
            executeJavaScript("alert(\"alert\");");
        else
            executeJavaScript("parent.alert(\"alert\");");
        bot.wait(1000);
        driver.switchTo().alert().accept();
    }



我最近遇到了一个问题,链接是在一个新选项卡中打开的,但selenium仍然集中在初始选项卡上。

我正在使用Chromedriver,关注选项卡的唯一方法是让我使用switch_to_window()

这是Python代码:

driver.switch_to_window(driver.window_handles[-1])

所以提示是找出你需要的窗口句柄的名称,它们存储为列表

driver.window_handles



解决

假设 :通过点击您网页上的内容,可以打开一个新标签。

使用以下逻辑切换到第二个选项卡。

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD2).build().perform();

以同样的方式,您可以再次切换回第一个标签。

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform();



使用Selenium 2.53.1使用firefox 47.0.1作为Java中的WebDriver:无论我打开多少个选项卡,“driver.getWindowHandles()”只返回一个句柄,因此无法在选项卡之间切换。

一旦我开始使用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
}

希望这能让您很好地了解如何在多个浏览器窗口中操作多个选项卡。




简单的答案对我有用:

for (String handle1 : driver1.getWindowHandles()) {
        System.out.println(handle1); 
        driver1.switchTo().window(handle1);     
}



这适用于MacOS for Firefox和Chrome:

// opens the default browser tab with the first webpage
driver.get("the url 1");
thread.sleep(2000);

// opens the second tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND + "t");
driver.get("the url 2");
Thread.sleep(2000);

// comes back to the first tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND, Keys.SHIFT, "{");



protected void switchTabsUsingPartOfUrl(String platform) {
    String currentHandle = null;
    try {
        final Set<String> handles = driver.getWindowHandles();
        if (handles.size() > 1) {
            currentHandle = driver.getWindowHandle();
        }
        if (currentHandle != null) {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform) && !currentHandle.equals(handle)) {
                    break;
                }
            }
        } else {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform)) {
                    break;
                }
            }
        }
    } catch (Exception e) {
        System.out.println("Switching tabs failed");
    }
}

调用此方法并将参数传递给要切换到的选项卡的url的子字符串




Links