如何在 Java 中使用 Selenium WebDriver 打开一个新的选项卡?

如何使用 Java 中的 Selenium WebDriver (又名 Selenium 2)在现有 Firefox 浏览器中打开一个新标签?

397876 次浏览

只是为了那些正在寻找 Ruby、 Python 和 C # 绑定(Selenium 2.33.0)的答案的人。

请注意,要发送的实际密钥取决于您的操作系统。例如,Mac 使用 CMD + T,而不是 Ctrl + T

露比

require 'selenium-webdriver'


driver = Selenium::WebDriver.for :firefox
driver.get('http://stackoverflow.com/')


body = driver.find_element(:tag_name => 'body')
body.send_keys(:control, 't')


driver.quit

巨蟒

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


driver = webdriver.Firefox()
driver.get("http://stackoverflow.com/")


body = driver.find_element_by_tag_name("body")
body.send_keys(Keys.CONTROL + 't')


driver.close()

C #

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;


namespace StackOverflowTests {


class OpenNewTab {


static void Main(string[] args) {


IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://stackoverflow.com/");


IWebElement body = driver.FindElement(By.TagName("body"));
body.SendKeys(Keys.Control + 't');


driver.Quit();
}
}
}

下面的代码将在新的选项卡中打开链接。

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

下面的代码将打开一个空的新选项卡。

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

下面的代码将在新窗口中打开链接:

String selectAll = Keys.chord(Keys.SHIFT, Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);

您可以使用以下代码使用 Java 和 Selenium WebDriver:

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

使用 JavaScript:

WebDriver driver = new FirefoxDriver(); // Firefox or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");

打开一个新标签后,它需要切换到该标签:

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));

在 Firefox 浏览器中试试这个。

/*  Open new tab in browser */
public void openNewTab()
{
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
}
// To open a new tab in an existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +  "t");
 Actions at=new Actions(wd);
at.moveToElement(we);
at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();

为什么不这么做呢

driver.ExecuteScript("window.open('your url','_blank');");

使用 Selenium WebDriver 在现有 Firefox 浏览器中打开一个新选项卡

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t");

Node.js的同样例子:

var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
withCapabilities(capabilities).
build();
...
driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");

我们如何打开一个新的,但更重要的是,我们如何做的东西,在这个新的标签?

WebDriver 不会为每个选项卡添加一个新的 WindowHandle,并且只能控制第一个选项卡。因此,在选择一个新的选项卡(Control + Tab Number)设置之后。DefaultContent () ,将可见选项卡定义为您要处理的选项卡。

VisualBasic

Dim driver = New WebDriver("Firefox", BaseUrl)


' Open new tab - send Control T
Dim body As IWebElement = driver.FindElement(By.TagName("body"))
body.SendKeys(Keys.Control + "t")


' Go to a URL in that tab
driver.GoToUrl("YourURL")




' Assuming you have m tabs open, go to tab n by sending Control + n
body.SendKeys(Keys.Control + n.ToString())


' Now set the visible tab as the drivers default content.
driver.SwitchTo().DefaultContent()

要使用 Selenium WebDriver 在现有的 Chrome 浏览器中打开一个新标签页,你可以使用以下代码:

driver.FindElement(By.CssSelector("body")).SendKeys(Keys.Control + "t");
string newTabInstance = driver.WindowHandles[driver.WindowHandles.Count-1].ToString();
driver.SwitchTo().Window(newTabInstance);
driver.Navigate().GoToUrl(url);

我在 Java 中使用 Selenium 2.52.0,在 Firefox 44.0.2中使用 Selenium 2.52.0。

问题是,如果我调用 driver.getWindowHandles () ,我总是得到一个句柄。不知何故,这对我来说是有意义的,因为 Firefox 是一个单独的进程,而每个标签不是一个单独的进程。但也许我错了。不管怎样,我试着写出自己的解决方案:

// Open a new tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");


// URL to open in a new tab
String urlToOpen = "https://url_to_open_in_a_new_tab";


Iterator<String> windowIterator = driver.getWindowHandles()
.iterator();
// I always get handlesSize == 1, regardless how many tabs I have
int handlesSize = driver.getWindowHandles().size();


// I had to grab the original handle
String originalHandle = driver.getWindowHandle();


driver.navigate().to(urlToOpen);


Actions action = new Actions(driver);
// Close the newly opened tab
action.keyDown(Keys.CONTROL).sendKeys("w").perform();
// Switch back to original
action.keyDown(Keys.CONTROL).sendKeys("1").perform();


// And switch back to the original handle. I am not sure why, but
// it just did not work without this, like it has lost the focus
driver.switchTo().window(originalHandle);

我使用 Ctrl + T组合打开一个新的标签,Ctrl + W关闭它,并切换回原来的标签,我使用 Ctrl + 1(第一个标签)。

我知道我的解决方案并不完美,甚至不好,我也想切换到司机的开关呼叫,但正如我写的,这是不可能的,因为我只有一个句柄。也许这对同样情况的人会有帮助。

有一段时间,我在谷歌浏览器上打开新标签页时遇到了麻烦。

就连 driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");也不适合我。

我发现,仅仅关注驾驶员是不够的。窗户也必须有在前面的窗口。

我的解决方案是在 Chrome 中调用一个警报,将窗口拉到前面,然后执行命令。示例代码:

((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

如何使用 Selenium WebDriver 和 Java 为 Chrome 打开一个新标签:

ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
driver = new ChromeDriver(options);
driver.manage().window().maximize();
driver.navigate().to("https://google.com");
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_T);

以上代码将禁用第一个扩展,并使用机器人类,一个新的选项卡将打开。

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


ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());


driver.switchTo().window(tabs.get(0));

检查这个完整的例子来理解如何打开多个选项卡,并在选项卡之间切换,最后关闭所有选项卡。

public class Tabs {


WebDriver driver;


Robot rb;


@BeforeTest
public void setup() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Anuja.AnujaPC\\Downloads\\chromedriver_win32\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("http://qaautomated.com");
}


@Test
public void openTab() {
// Open tab 2 using CTRL + T keys.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");


// Open URL In 2nd tab.
driver.get("http://www.qaautomated.com/p/contact.html");


// Call switchToTab() method to switch to the first tab
switchToTab();


// Call switchToTab() method to switch to the second tab.
switchToTab();
}


public void switchToTab() {
// Switching between tabs using CTRL + tab keys.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");


// Switch to current selected tab's content.
driver.switchTo().defaultContent();
}


@AfterTest
public void closeTabs() throws AWTException {
// Used Robot class to perform ALT + SPACE + 'c' keypress event.
rb = new Robot();
rb.keyPress(KeyEvent.VK_ALT);
rb.keyPress(KeyEvent.VK_SPACE);
rb.keyPress(KeyEvent.VK_C);
}


}

这个例子是由 本网页给出的。

使用 Selenium WebDriver 处理浏览器窗口:

String winHandleBefore = driver.getWindowHandle();


for(String winHandle : driver.getWindowHandles())  // Switch to new opened window
{
driver.switchTo().window(winHandle);
}


driver.switchTo().window(winHandleBefore);   // Move to previously opened window

在 ChromeDriver 中打开一个新窗口。

// The script that will will open a new blank window
// If you want to open a link new tab, replace 'about:blank' with a link
String a = "window.open('about:blank','_blank');";
((JavascriptExecutor)driver).executeScript(a);

如需在选项卡之间切换,请阅读此处

由于 https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465中的一个 bug,即使 webdriver.switchTo 确实切换了选项卡,焦点仍然留在第一个选项卡上。

您可以通过在 switchWindow 之后执行 driver.get 来确认这一点,并看到第二个选项卡实际转到新的 URL,而不是原来的选项卡。

现在的解决办法是 有人建议。 使用 JavaScript 代码打开一个警报,然后使用 webDriver 接受它。

这段代码对我很有用(Selenium 3.8.1、 chromeDriver 2.34.522940和 Chrome63.0) :

public void openNewTabInChrome() {


driver.get("http://www.google.com");


WebElement element = driver.findElement(By.linkText("Gmail"));
Actions actionOpenLinkInNewTab = new Actions(driver);
actionOpenLinkInNewTab.moveToElement(element)
.keyDown(Keys.CONTROL) // MacOS: Keys.COMMAND
.keyDown(Keys.SHIFT).click(element)
.keyUp(Keys.CONTROL).keyUp(Keys.SHIFT).perform();




ArrayList<String> tabs = new ArrayList(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.get("http://www.yahoo.com");
//driver.close();
}

问题 : 如何使用 Selenium WebDriver 和 Java 打开一个新的选项卡?

回答 : 单击任何链接后,打开一个新的选项卡。

如果我们想处理一个新打开的选项卡,那么我们需要使用. switchTo () . window ()来处理选项卡 指挥官。

切换到特定的选项卡,然后执行操作并切换回父选项卡。

package test;


import java.util.ArrayList;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;


public class Tab_Handle {


public static void main(String[] args) {


System.setProperty("webdriver.gecko.driver", "geckodriver_path");


WebDriver driver = new FirefoxDriver();


driver.get("http://www.google.com");


// Store all currently open tabs in Available_tabs
ArrayList<String> Available_tabs = new ArrayList<String>(driver.getWindowHandles());


// Click on link to open in new tab
driver.findElement(By.id("Url_Link")).click();


// Switch newly open Tab
driver.switchTo().window(Available_tabs.get(1));


// Perform some operation on Newly open tab
// Close newly open tab after performing some operations.
driver.close();


// Switch to old(Parent) tab.
driver.switchTo().window(Available_tabs.get(0));


}


}

要使用 JavascriptExecator 打开新的选项卡,

((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));

将按照索引控制选项卡:

driver.switchTo().window(tabs.get(1));

主选项卡上的驱动程序控制:

driver.switchTo().window(tabs.get(0));

Selenium 不支持打开新标签。它只支持打开新窗口。无论如何,一个新窗口在功能上等同于一个新的选项卡。

有各种各样的技巧可以解决这个问题,但是从长远来看,它们会给您带来其他问题。

这行代码将使用 Selenium WebDriver 打开一个新的浏览器选项卡:

((JavascriptExecutor)getDriver()).executeScript("window.open()");

爪哇咖啡

我建议使用 强 > JavascriptExecutor:

  • 打开新的空白窗口:
((JavascriptExecutor) driver).executeScript("window.open()");
  • 打开具有特定 URL 的新窗口:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

进口情况如下:

import org.openqa.selenium.JavascriptExecutor;

这里几乎所有的答案都过时了。

(Ruby 示例)

WebDriver 现在支持打开标签:

browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window

将打开一个新的标签页。打开一个窗口实际上已经成为非标准情况:

browser.manage.new_window(:window)

选项卡或窗口不会自动对焦。切换到该选项卡或窗口:

browser.switch_to.window new_tab

如果你想打开新标签,你可以使用这个

 ((JavascriptExecutor) getDriver()).executeScript("window.open()");

如果你想从新标签打开链接,你可以使用这个

使用 Javascript 执行器:

 public void openFromNewTab(WebElement element){
((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
}

行动:

 WebElement element = driver.findElement(By.xpath("your_xpath"));
Actions actions = new Actions(driver);
actions.keyDown(Keys.LEFT_CONTROL)
.click(element)
.keyUp(Keys.LEFT_CONTROL)
.build()
.perform();

从 selenium > = 4.0开始,就不需要 javascript 或 send_keys工作区了。Selenium 4提供了一个名为 newWindow的新 API,它允许您创建一个新窗口(或选项卡)并自动切换到该窗口。因为新窗口或选项卡是在同一个会话中创建的,所以它避免了创建新的 WebDriver 对象。

巨蟒

打开新标签

from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes


driver.switch_to.new_window(WindowTypes.TAB)

打开新窗口

from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes


driver.switch_to.new_window(WindowTypes.WINDOW)

爪哇咖啡

打开新窗口

driver.get("https://www.google.com/");
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.WINDOW);
// Opens LambdaTest homepage in the newly opened window
driver.navigate().to("https://www.lambdatest.com/");

打开新标签

driver.get("https://www.google.com/");
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.TAB);
// Opens LambdaTest homepage in the newly opened tab
driver.navigate().to("https://www.lambdatest.com/")

使用下面的代码片段在新标签页中打开链接:

    public void openLinkInNewTab(String link){


String currentHandle = driver().getWindowHandle();
((JavascriptExecutor) driver()).executeScript("window.open()");
//getting all the handles currently available
Set<String> handles = driver().getWindowHandles();
for (String actual : handles) {


if (!actual.equalsIgnoreCase(currentHandle)) {
//switching to the opened tab
driver().switchTo().window(actual);


//opening the URL saved.
driver.get(link);
}
}
}

有三种方法可以做到这一点。在下面的例子中,我按照以下步骤在新标签中打开 facebook,

  • 启动 https://google.com
  • 搜索 facebook文本并得到 facebook URL
  • 在不同的选项卡中打开 facebook

解决方案 # 1 : 使用 window handles

driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
        

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
        

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
        

driver.get(facebookUrl);

解决方案 # 2 : 通过创建新的 driver实例。不推荐这样做,但这也是一种可行的方法。

driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");


/*Create an another instance of driver.*/
driver = new ChromeDriver(options);
driver.get(facebookUrl);

解决方案 # 3: 使用硒4

driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
driver.switchTo().newWindow(WindowType.TAB);
driver.navigate().to(facebookUrl);

爪哇咖啡,

您可以尝试下面的代码,以便在 seleniumjava 中打开一个新的选项卡。

public static void switchToWindow(WebDriver driver) {
for (String winHandle : driver.getWindowHandles()) {
driver.switchTo().window(winHandle);
}
}

你可以通过以下简单的代码行来解决 selenium 驱动程序中的 Control-T 快捷键错误,这些代码行用于执行 javascript 来打开一个新的选项卡,然后你就必须切换到那个选项卡。

driver.execute_script("window.open();")

下面是一个简单的例子:

import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.get("https://example.com")
time.sleep(0.5)
driver.execute_script("window.open();")
window_after = driver.window_handles[-1]
time.sleep(0.5)
driver.switch_to.window(window_after)
driver.get("https://google.com")

如果你需要在新标签页中打开一个特定的链接,你可以像下面这样直接将快捷方式发送到链接:

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
driver.findElement(By.xpath("//a[strong[.='English']]")).sendKeys(selectLinkOpeninNewTab);

下面是一个可运行的示例

如果你需要打开一个新的选项卡,并想选择哪个链接是立即打开该选项卡,你可以使用 JavaScript 执行程序像这样:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.open('https://www.wikipedia.org/', '_blank');");

下面是一个使用 JSE 的可运行案例

在用于 Java 的 新版本中,他们添加了一个创建新选项卡的方法:

driver.switchTo().newWindow(WindowType.TAB);

或者一个新的窗口:

driver.switchTo().newWindow(WindowType.WINDOW);

这里是官方 回购上的一个示例的链接

这是 Selenium 最新版本的一个纯硒函数。 如果您正在使用这样的规范,请尝试这样做。

对于输入,该函数需要当前使用的驱动程序和当前的 Window Handle 字符串(这只是为了确保在转到新选项卡之前打开了一个窗口。). 返回字符串用于新的 Window 句柄。

public static String switchToNewTab(WebDriver driver, String sCurrentWindowHandle) {
String newTabHandle = null;


try {
driver = driver.switchTo().newWindow(WindowType.TAB);
newTabHandle = driver.getWindowHandle();


} catch (Exception e) {
e.printStackTrace();
}


return newTabHandle;
}