如何使用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.