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

评论

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

我使用Java。我得到了一个解决方案“ m_Driver.findElement(By.cssSelector(” body“))。sendKeys(Keys.CONTROL +” t“);”并且完全正常。

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

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

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

#1 楼

下面的代码将在新选项卡中打开链接。
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);


评论


如果您使用的是Mac,请使用Keys.COMMAND而不是Keys.CONTROL

–nanospeck
15/12/19在7:36



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

–mkasberg
18年5月30日在21:45

问题是window.open()可能会打开一个新窗口,而不是ne选项卡。在Firefox的测试模式下会这样做。至少从Katalon(在后台使用Selenium)运行时。

– Nux
9月3日9:06

#2 楼

仅适用于正在寻找使用Ruby,Python和C#绑定(Selenium 2.33.0)的答案的任何人。
请注意,实际发送的密钥取决于您的操作系统。例如,Mac使用CMD + T而不是Ctrl +T。
Ruby
 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();
        }
    }
}
 


评论


您如何返回上一个标签?

–lurscher
13年7月16日在5:51

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

–马克·罗兰兹(Mark Rowlands)
13年7月16日在15:42

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

–布隆德尔
2014年10月1日17:37



这对我不起作用。我尝试了几种按ctrl + t的方法,但没有一种方法可以成功打开新标签页。

– Thayne
2014年11月24日在21:26

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

–吉利
2014年11月28日在16:14



#3 楼

为此:
driver.ExecuteScript("window.open('your URL', '_blank');");


评论


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

–伯特羊肉
2015年5月6日17:09

在您可以控制浏览器设置的位置进行测试可能是安全的

– kernowcode
15年8月25日在14:21

可能会很好。 chromedriver似乎禁用了所有扩展(例如adblock)

–乔什·奥布莱恩(Josh O'Bryan)
15年8月31日在20:17

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

–史蒂文
16-3-3在17:20



如果要在选项卡中打开空白页,则可以使用driver.ExecuteScript(“ window.open('about:blank','_ blank');”);

–史蒂文
16年3月3日在18:13

#4 楼

要使用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
18/12/27在10:32



第三个选项卡也是如此。我可以知道在哪里抛出异常(在驱动程序关闭时)吗?

–石田沙(Ishita Shah)
18/12/27在11:12

不,在此行driver.switchTo()。window(tabs.get(2));,这很好((JavascriptExecutor)驱动程序).executeScript(“ window.open('https://www.stackoverflow.com' ,'_空白');”); Thread.sleep(3000); (((JavascriptExecutor)驱动程序).executeScript(“ window.open('https://www.flipkart.com','_blank');”);;但我没有任何切换到Windows的控件。

–cruisepandey
18/12/27在13:03

#5 楼

您可以在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));


评论


此处已执行手动操作Ctrl + T来打开新标签页

– Ripon Al Wasim
16-4-27的11:15

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

– Ripon Al Wasim
18年4月24日在10:00

// @ Shivam:非常感谢。听到代码工作时感到很高兴。

– Ripon Al Wasim
18年5月7日在9:43

谢谢!实际上只有一件事

–毫无生气
8月31日21:25

#6 楼

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

要在标签之间进行切换,请阅读此处。

#7 楼

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


#8 楼


(Ruby示例)
WebDriver现在支持打开选项卡:
browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window

将打开一个新选项卡。打开窗口实际上已成为非标准情况:
browser.manage.new_window(:window)

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


评论


这仅适用于Selenium 4+吗?文档中提到“ Selenium 4提供了一个新的API NewWindow,它会创建一个新的选项卡(或)并自动切换到新窗口。”从该引言中我并不完全清楚,是否单独打开一个新窗口/选项卡(没有自动切换到它)是pre-v4 API的一部分。

– lolotobg
12月2日13:54

还请记住,有一些API可在打开新窗口/选项卡(Ruby中为original_window = driver.window_handle)之前获取其句柄,并在完成后将焦点恢复至原始选项卡(驱动程序)。关闭,然后输入driver.switch_to.window original_window)。

– lolotobg
12月2日13:59

#9 楼

要使用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,非常适合进行大量的链接测试,因为它不占用大量资源。

– JWP
16年5月16日在16:07

一个解释将是有条理的。与以前的答案有何不同?

– Peter Mortensen
12月5日12:03

#10 楼

以下代码将在新窗口中打开链接:
String selectAll = Keys.chord(Keys.SHIFT, Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);


评论


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

–罗比诺
18年1月7日在22:21

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

– Bryan_C
18年3月21日在23:25

#11 楼

我暂时无法在Google 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");


#12 楼

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


#13 楼

我在Java和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(第一个选项卡)。
我知道防雷解决方案不是完美的,甚至不是很好,我也想使用驱动程序的switchTo调用进行切换,但是正如我写的那样,因为只有一个句柄,所以这是不可能的。也许这对处于相同情况的人会有所帮助。

#14 楼

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

上面的代码将禁用第一个扩展名,并使用机械手类,将打开一个新标签页。

#15 楼

这行代码将使用Selenium WebDriver打开一个新的浏览器选项卡:
((JavascriptExecutor)getDriver()).executeScript("window.open()");


评论


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

–MamathaMacherla
19-09-20在9:39

#16 楼

Java
我建议您使用JavascriptExecutor

打开新的空白窗口:

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


打开具有特定URL的新窗口:

((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

以下导入:
import org.openqa.selenium.JavascriptExecutor;


#17 楼

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

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


#18 楼

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


评论


将来,请提供一些说明文字以及代码段,以使您的帖子更易于理解。

–泰勒·詹德罗(Tyler Jandreau)
16年4月5日在14:35

#19 楼

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

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

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


评论


一个解释将是有条理的。

– Peter Mortensen
12月5日12:11

#20 楼

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


评论


什么例子这个问题没有任何例子。

– Peter Mortensen
12月5日12:00



#21 楼

我们如何才能打开一个新的但更重要的是如何在该新选项卡中进行操作?
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()


评论


Visual Basic? C#绑定涵盖了它吗?

– Peter Mortensen
12月5日12:02

#22 楼

该代码对我有用(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 楼

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

    }

}


#24 楼

Selenium不支持打开新选项卡。它仅支持打开新窗口。出于所有目的和目的,无论如何新窗口在功能上都等同于新选项卡。
有各种各样的方法可以解决此问题,但从长远来看,它们会给您带来其他问题。

#25 楼

如果要打开新选项卡,可以使用此
 ((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();


#26 楼

由于https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465中存在错误,即使webdriver.switchTo实际上确实切换了标签页,焦点仍位于第一个标签页上。
您可以通过在switchWindow之后执行driver.get来确认这一点,并看到第二个选项卡实际上进入了新的URL,而不是原始的选项卡。
目前的解决方法是建议yardening2。
使用JavaScript代码打开警报,然后使用webdriver接受它。

#27 楼

查看此完整示例,了解如何打开多个选项卡并在这些选项卡之间切换,最后关闭所有选项卡。
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);
    }

}

此示例由此网页提供。

#28 楼

使用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年3月13日在12:28