如何使用Selenium WebDriver在Chrome中打开一个新标签页链接?

28
System.setProperty("webdriver.chrome.driver", "D:\\softwares\\chromedriver_win32\\chromedriver.exe");

WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("https://mail.google.com/");
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("www.facebook.com")).sendKeys(selectLinkOpeninNewTab);

新标签页正在打开,但URL链接未能打开。

14个回答

48

以下代码对我在Selenium 3和Chrome版本58上有效。

    WebDriver driver = new ChromeDriver();
    driver.get("http://yahoo.com");  
    ((JavascriptExecutor)driver).executeScript("window.open()");
    ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1));
    driver.get("http://google.com");

4
这是最佳解决方案,因为在Chrome浏览器上,Ctrl + t总是失效,详见 https://github.com/SeleniumHQ/selenium/issues/5462 - vikramvi
超级,它按预期工作。在Chrome中Ctrl+t坏了,但在Chromium中有一个问题:“org.openqa.selenium.WebDriverException: disconnected: unable to connect to renderer”,可以通过catch块处理。感谢您的答案。 - Chaitanya Pujari
1
driver.switchTo().window(tabs.get(tabs.size()-1)); <---- 如果没有这个,driver将无法看到新打开的标签页,仍然在之前的标签页上工作。以下是获取最后一个标签页的更通用方法。 - Eluny

30

我用以下代码进行了检查,对我来说运行得很好。我从这里找到了答案。

    driver = new ChromeDriver();
    driver.manage().window().maximize();
            
    String baseUrl = "http://www.google.co.uk/";
    driver.get(baseUrl);
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

    ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1)); //switches to new tab
    driver.get("https://www.facebook.com");
    
    driver.switchTo().window(tabs.get(0)); // switch back to main screen        
    driver.get("https://www.news.google.com");

1
它运行良好,但是又打开了一个浏览器窗口。 - nlogn
它在我的新标签页中运行。你能确认一下这个(driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");)命令是否对你打开了新窗口或新标签页? - Abdul Hameed
3
对我来说没有用,只有一个选项卡打开了第一个网址。 - biplab rout
4
在第 31 行出现了异常,代码为 driver.switchTo().window(tabs.get(1))。异常类型为 java.lang.IndexOutOfBoundsException,表示索引越界,因为列表大小为 1,但是使用了索引值为 1 的位置。具体错误信息为 Index: 1, Size: 1,提示尝试访问的索引为 1,而实际上列表大小只有 1。在 ArrayList 类的 rangeCheck 方法和 get 方法中发生了异常。 - user3252885
2
我在chromedriver中尝试了上述方法,但它没有起作用。然后我尝试了((JavascriptExecutor)driver).executeScript("window.open()");,这样就打开了一个新标签页。 - Karan
在我的 Mac 上无法工作。我尝试使用 command 代替 control,并按下 T,但仍然失败了。非常希望能找到解决方案。 - d-b

15
我尝试过其他技术,但它们都没有起作用,也没有出现任何错误,但当我使用下面的代码时,它对我起到了作用。

我尝试过其他技术,但它们都没有起作用,也没有出现任何错误,但当我使用下面的代码时,它对我起到了作用。

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

你的回答和Nur在上面的回答有什么区别? Nur比你早回答了一年多。 - d-b

11

Selenium 4现在已经包含了这个功能,您可以直接使用任何URL打开新标签页或新窗口。

WebDriverManager.chromedriver().setup();

driver = new ChromeDriver(options);

driver.get("www.Url1.com");     
//  below code will open Tab for you as well as switch the control to new Tab
driver.switchTo().newWindow(WindowType.TAB);

// below code will navigate you to your desirable Url 
driver.get("www.Url2.com");

下载Maven依赖项,这是我下载的内容 -

        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency> 
        

您可以参考:https://codoid.com/selenium-4-0-command-to-open-new-window-tab/

观看视频:https://www.youtube.com/watch?v=7SpCMkUKq-Y&t=8s

在谷歌搜索中搜索 - WebDriverManager selenium 4


6

如果您可以获取链接元素,则可以使用此方法。它也会将您带到您已打开的选项卡。

WebElement link= driver.findElement(By.tagname("a"));  
String keyString =   Keys.CONTROL+Keys.SHIFT.toString()+Keys.ENTER.toString());
link.sendKeys(keyString);

这将会打开一个新窗口而不是标签页。 - manjeet lama

3

首先使用键盘快捷键Ctrl+t打开一个新的空标签页,然后使用.get()方法获取你想要的URL。你的代码应该像这样 -

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

driver.get("www.facebook.com");

如果你想在新标签页打开当前视图上的链接,则可以使用上面所写的代码。请确保使用适当的By选择器类来选择网页元素,而不是使用By.linkText()

3
我曾使用以下代码通过 C# selenium 在浏览器中打开新选项卡:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;

js.ExecuteScript("window.open();");

对于Java来说,代码如下:JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("window.open()"); - Asad Shakeel

2

Selenium只能自动化浏览器的WebElements。打开新标签页是在独立应用程序——webBrowser上执行的操作。为此,您可以使用java.util.*包中的Robot类,该类可使用键盘执行操作,而不管应用程序类型如何。

以下是您需要的操作代码:

//Java代码 Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_T); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyRelease(KeyEvent.VK_T);

请注意,您无法使用Robot类自动化独立应用程序,但可以执行键盘或鼠标操作。

System.setProperty("webdriver.chrome.driver","softwares\\chromedriver_win32\\chromedriver.exe"); 
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("http://www.google.com");
Robot rob = new Robot();
rob.keyPress(keyEvent.VK_CONTROL);
rob.keyPress(keyEvent.VK_T);
rob.keyRelease(keyEvent.VK_CONTROL);
rob.keyRelease(keyEvent.VK_T);

在这一步之后,您需要一个窗口迭代器来切换到新标签页:

Set <String> ids = driver.getWindowHandles();
Iterator <String> it = ids.iterator();
String currentWindow = it.next();
String newWindow = it.next();
driver.switchTo().window(newWindow);
driver.findElement(By.linkText("www.facebook.com")).sendKeys(selectLinkOpeninNewTab);

2

如果要点击链接并在新标签页中打开,请使用以下方法:

WebDriver driver = new ChromeDriver(); 
driver.get("https://www.yourSite.com"); 
WebElement link = driver.findElement(By.xpath("path_to_link")); 

Actions actions = new Actions(driver); 
actions.keyDown(Keys.LEFT_CONTROL) 
       .click(link) 
       .keyUp(Keys.LEFT_CONTROL) 
       .build() 
       .perform(); 

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

这看起来更像是,但上面的 link 需要是 element(或者反过来)吗? - ndtreviv
啊,而且它似乎不能与org.seleniumhq.selenium:selenium-java:4.1.0一起使用。 - ndtreviv

1

原帖作者询问如何在新标签页中打开链接。以下是我在C#中的做法。

        IWebDriver driver = new ChromeDriver();
        driver.Manage().Window.Maximize();
        driver.Navigate().GoToUrl("https://microsoft.com");
        IWebElement eventlink = driver.FindElement(By.Id("uhfLogo"));
        Actions action = new Actions(driver);
        action.KeyDown(Keys.Control).MoveToElement(eventlink).Click().Perform(); 

这实际上是对选定元素执行Control+Click操作,以在新标签页中打开链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接