如何使用Selenium WebDriver打开新标签?

时间:2013-07-09 11:47:55

标签: selenium firefox selenium-webdriver browser-tab

如何使用Selenium WebDriver(a.k.a.Selenium 2)在现有Firefox浏览器中打开新标签?

31 个答案:

答案 0 :(得分:78)

仅适用于在Ruby / Python / C#绑定中寻找答案的其他人(Selenium 2.33.0)。

请注意,要发送的实际密钥取决于您的操作系统,例如,Mac使用的是COMMAND + t,而不是CONTROL + 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

<强>的Python

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

答案 1 :(得分:42)

以下代码将打开新标签中的链接。

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

答案 2 :(得分:24)

为什么不这样做

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

答案 3 :(得分:7)

在Chrome驱动程序中打开新窗口。

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

For switching between tabs, Read here

答案 4 :(得分:6)

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

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

使用JavaScript:

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

答案 5 :(得分:5)

尝试使用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));
}

答案 6 :(得分:4)

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

(Ruby示例)

WebDriver现在支持打开选项卡:

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

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

browser.manage.new_window(:window)

选项卡或窗口将不会自动聚焦。要切换到它:

browser.switch_to.window new_tab

答案 7 :(得分:3)

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

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

答案 8 :(得分:3)

要使用JavascriptExecutor打开新标签,

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

答案 9 :(得分:2)

我在Chrome中打开一个新选项卡有一段时间了。 即使driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");也不适合我。

我发现selenium专注于驱动程序还不够,Windows也必须将窗口放在前面。

我的解决方案是在chrome上调用一个警告,将窗口置于前面,然后执行命令。示例代码:

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

答案 10 :(得分:2)

要使用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);

答案 11 :(得分:1)

如何使用Selenium WebDriver和Java for 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);

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

答案 12 :(得分:1)

我在Java和Firefox 44.0.2中使用Selenium 2.52.0。不幸的是,以上解决方案都不适用于我。问题是如果我调用driver.getWindowHandles()我总是得到1个单句柄。不知怎的,这对我来说很有意义,因为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(第一个标签)。我知道我的解决方案并不完美甚至不错,我也想用驱动程序的switchTo调用切换,但是因为我写的它不可能,因为我只有一个句柄。也许这对有相同情况的人有帮助。

答案 13 :(得分:1)

//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

答案 14 :(得分:0)

问题:如何使用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));

    }

}

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

从 selenium >= 4.0 开始,不需要 javascript 或 send_keys 解决方法。 Selenium 4 提供了一个名为 newWindow 的新 API,可让您创建新窗口(或选项卡)并自动切换到它。由于新窗口或选项卡是在同一个会话中创建的,因此避免了创建新的 WebDriver 对象。

Python

打开新标签

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)

Java

打开新窗口

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/")

答案 17 :(得分:0)

如果要打开新标签,可以使用此标签

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

如果您想从新标签打开链接,可以使用此

使用JavascriptExecutor:

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

答案 18 :(得分:0)

* JAVA

我建议使用 JavascriptExecutor

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

正在导入:

import org.openqa.selenium.JavascriptExecutor;

答案 19 :(得分:0)

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

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

答案 20 :(得分:0)

Selenium不支持打开新选项卡,它仅支持打开新窗口。出于所有目的,无论如何新窗口在功能上都等同于新选项卡。

可以通过多种方法解决此问题,但从长远来看,它们会给您带来其他问题。

答案 21 :(得分:0)

 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();

答案 22 :(得分:0)

此代码适合我(selenium 3.8.1,chromedriver = 2.34.522940,chrome = 63.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();
}

答案 23 :(得分:0)

由于https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465中的错误,即使webdriver.switchTo实际上切换了标签,焦点仍留在第一个标签上。您可以通过在switchWindow之后执行driver.get来确认这一点,并看到第二个选项卡实际上是转到新URL而不是原始选项卡。

现在解决的是@ yardening2建议的内容。 使用js打开警报,然后使用webdriver接受它。

答案 24 :(得分:0)

使用Selenium WebDriver在现有Firefox浏览器中打开新标签页

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

答案 25 :(得分: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 1st tab
  switchToTab(); 


  //Call switchToTab() method to switch to 2nd 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);
 } }

此示例由this web page

提供

答案 26 :(得分:0)

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

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

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

答案 27 :(得分:0)

nodejs的相同示例:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

答案 28 :(得分:0)

如何打开一个新的,但更重要的是,你如何在新标签中进行操作? Webdriver不会为每个选项卡添加新的WindowHandle,只能控制第一个选项卡。因此,在选择新选项卡(Control + Tab Number)后,在驱动程序上设置.DefaultContent(),以将可见选项卡定义为您要进行处理的选项卡。

Visual Basic

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()

答案 29 :(得分:-1)

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");// open in new tab
driver.get("ur link");

答案 30 :(得分:-1)

使用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