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


114

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


您正在使用哪种编程语言?
alecxe

2
我使用Java。我得到了一个解决方案“ m_Driver.findElement(By.cssSelector(” body“))。sendKeys(Keys.CONTROL +” t“);” 它的工作完全正常。
Bhakti Shah 2013年

这样您就可以控制新标签了吗?Selenium不支持新选项卡(而是尝试打开新窗口)。见我的答案stackoverflow.com/questions/14550360/…stackoverflow.com/questions/17225911/…。您到底想达到什么目的?
PetrJaneček'13

我想复制一些文本,然后打开一个新标签,然后将相同的文本粘贴到新标签中。我没有尝试控制新选项卡,但是它可以很好地实现我想要的功能。
Bhakti Shah 2013年

我通过使用该元素的GetText()做了同样的事情,然后执行了Driver.get(text)。
Bhakti Shah 2013年

Answers:


53

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

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

7
如果您使用的是Mac,请使用Keys.COMMAND而不是Keys.CONTROL。– nanospeck
2015年

2
该解决方案似乎不是最佳解决方案,因为它取决于特定于操作系统的(或可能特定于浏览器的)快捷方式...至少,如果使用的是JS之类的东西,则window.open()可以期望它可以在许多平台/浏览器上使用。
mkasberg '18

86

只适用于在Ruby / Python / C#绑定中寻求答案的任何人(硒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

蟒蛇

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

2
您如何返回上一个标签?
lurscher

11
WebDriver可以处理多个选项卡-简单地将它们视为单独的窗口。因此,您只需要driver.switchTo().window(windowName);访问任何选项卡或窗口。显然,您需要像往常一样跟踪窗口名称,以便在它们之间进行切换。
Mark Rowlands

1
您能否解释为什么要检索元素并将Ctrl-t发送到该元素?那没有任何意义……您不能“在网络元素上按Ctrl + t”吗?为什么不只运行新的Actions(WebDriver).SendKeys(Keys.Control +“ w”).Perform(); 请有人可以解释吗?
Brondahl 2014年

4
@Thayne ChromeDriver错误会阻止CTRL + T起作用。您可以使用CTRL + LMB作为解决方法。有关示例代码,请参见code.google.com/p/chromedriver/issues/detail?id=903#c2
吉利2014年

1
只需添加python代码示例即可使用CTRL + LMB。ActionChains(driver).key_down(Keys.CONTROL).click(element_to_be_clicked).key_up(Keys.CONTROL).perform()。该ActionChains从进口selenium.webdriver.common.action_chains
Java徐

34

为什么不这样做

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

大多数弹出窗口阻止程序将阻止此尝试
Bert Lamb

1
可能可以安全地测试您可以控制浏览器设置的位置
kernowcode 2015年

1
可能会很好。chromedriver似乎禁用了所有扩展程序(即adblock)
Josh O'Bryan 2015年

4
在更新到Chrome 49.0.2623.75m后,“发送密钥”方法对我不再有效,并且该方法在该Chrome版本上适用。
史蒂文

6
如果您想在标签中打开空白页,可以driver.ExecuteScript("window.open('about:blank','_blank');");
史蒂文(Steven

12

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

如何启动3个URL?driver.switchTo().window(tabs.get(1)); driver.get("https://www.stackoverflow.com"); Thread.sleep(2000); driver.switchTo().window(tabs.get(2)); driver.get("https://www.flipkart.com"); Thread.sleep(2000); driver.close(); driver.switchTo().window(tabs.get(1)); Thread.sleep(2000); driver.close(); driver.switchTo().window(tabs.get(0));,我已经尝试过了,但是让数组超出了绑定异常,如果您知道任何解决方案,请告诉我。
cruisepandey

第三选项卡也是如此。我可以知道异常抛出的确切位置(驱动程序关闭时)吗?
Ishita Shah

不,在这一行上driver.switchTo().window(tabs.get(2));,它可以正常工作,((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");但我没有任何控件可以切换到Windows。
cruisepandey


8

您可以将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()");

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

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

此处已实施了手动操作Ctrl + T来打开新标签页
Ripon Al Wasim,2016年

// @钱德拉·谢卡(Chandra Shekhar):能否请您尝试上面的我的JS代码?
Ripon Al Wasim

// @ Shivam:非常感谢。听到代码工作时感到很高兴。
Ripon Al Wasim '18年

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

3

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

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

1
类型对象“键”没有属性“和弦”
Robino

@罗比诺 我在Keys类(org.openqa.Selenium)中看到它
MrBCut

3

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

WebDriver现在支持打开选项卡:

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

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

browser.manage.new_window(:window)

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

browser.switch_to.window new_tab

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

是的,这很好用,它可以在现有url的同一选项卡中打开一个新url,非常适合进行大量的链接测试,因为它不占用大量资源。
约翰·彼得斯

2

我暂时无法在Chrome中打开新标签页。甚至driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");没有为我工作。

我发现,硒仅专注于驱动程序是不够的,Windows还必须将窗口置于最前面。

我的解决方案是在chrome上调用警报,该警报会将窗口置于最前面,然后执行命令。样例代码:

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

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调用进行切换,但是正如我写的那样,因为我只有一个句柄,所以这是不可能的。也许这对同样情况的人会有帮助。


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

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

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


1

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

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

当我在代码上方运行chrome时,它打开了一个新标签页。但是,在Firefox中会打开一个新窗口。在这两种情况下,窗口处理程序对于新打开的窗口处理程序都是不同的。因此,我认为标签页或多或少与窗口相同。当然,隐身窗口绝对不同于窗口的常规选项卡。
MamathaMacherla

1

* JAVA

我建议使用JavascriptExecutor

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

导入后:

import org.openqa.selenium.JavascriptExecutor;

0

nodejs的相同示例:

var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
                    withCapabilities(capabilities).
                    build();
...

driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");

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

0

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

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


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

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

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

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

该示例由该网页给出


0

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

@ yardening2建议立即解决。使用js打开警报,然后使用webdriver接受警报。


0

此代码对我有用(硒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();
}

0

:如何使用带有Java的Selenium WebDriver打开新选项卡?

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

如果要处理新打开的选项卡,则必须使用.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));

    }

}

0

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

有各种各样的方法可以解决该问题,但从长远来看,它们会给您带来其他问题。


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

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

-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

无法解决该问题。您的回答是关于切换到现有的窗口,OP询问如何打开一个新窗口。
Thomas Hirsch '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.