Wie öffne ich einen neuen Tab mit Selenium WebDriver?


114

Wie öffne ich mit Selenium WebDriver (auch bekannt als Selenium 2) einen neuen Tab im vorhandenen Firefox-Browser?


Welche Programmiersprache verwenden Sie?
Alecxe

2
Ich benutze Java. Ich habe eine Lösung "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" und es funktioniert völlig gut.
Bhakti Shah

Können Sie dann die neue Registerkarte steuern? Selen unterstützt keine neuen Registerkarten (es wird stattdessen versucht, neue Fenster zu öffnen). Siehe meine Antworten stackoverflow.com/questions/14550360/… und stackoverflow.com/questions/17225911/… . Was genau versuchst du zu erreichen?
Petr Janeček

Ich wollte Text kopieren und dann eine neue Registerkarte öffnen und denselben Text in die neue Registerkarte einfügen. Ich habe nicht versucht, die neue Registerkarte zu steuern, aber es funktioniert gut für das, was ich erreichen möchte.
Bhakti Shah

Ich habe das gleiche getan, indem ich GetText () dieses Elements verwendet habe und dann Driver.get (Text).
Bhakti Shah

Antworten:


53

Der folgende Code öffnet den Link in der neuen Registerkarte.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

Der folgende Code öffnet einen leeren neuen Tab.

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

7
Verwenden Sie Keys.COMMAND anstelle von Keys.CONTROL, wenn Sie mac
nanospeck

2
Diese Lösung scheint nicht optimal zu sein, da sie von betriebssystemspezifischen (und möglicherweise browserspezifischen) Verknüpfungen abhängt. Wenn Sie beispielsweise JS verwenden window.open(), können Sie davon ausgehen, dass sie auf vielen Plattformen / Browsern funktioniert.
Mkasberg

86

Nur für alle anderen, die nach einer Antwort in Ruby / Python / C # -Bindungen suchen (Selenium 2.33.0).

Beachten Sie, dass die tatsächlich zu sendenden Schlüssel von Ihrem Betriebssystem abhängen, z. B. von Mac COMMAND + tanstelle von CONTROL + t.

Rubin

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

2
Wie kehren Sie zur vorherigen Registerkarte zurück?
Lurscher

11
WebDriver kann mehr als eine Registerkarte verarbeiten - es behandelt sie einfach als separate Fenster. Sie müssen also nur driver.switchTo().window(windowName);auf eine Registerkarte oder ein Fenster zugreifen. Natürlich müssen Sie die Fensternamen wie gewohnt verfolgen, um zwischen ihnen wechseln zu können.
Mark Rowlands

1
Können Sie erklären, warum Sie ein Element abrufen und die Strg-T an dieses Element senden? Das macht keinen Sinn ... Sie können nicht "Strg + t auf einem Webelement"? Warum nicht einfach neue Aktionen ausführen (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Könnte mir bitte jemand erklären?
Brondahl

4
@Thayne ein ChromeDriver-Fehler verhindert, dass STRG + T funktioniert. Sie können STRG + LMB als Problemumgehung verwenden. Beispielcode finden Sie unter code.google.com/p/chromedriver/issues/detail?id=903#c2 .
Gili

1
Fügen Sie einfach das Beispiel für Python-Code hinzu, um STRG + LMB zu verwenden. ActionChains(driver).key_down(Keys.CONTROL).click(element_to_be_clicked).key_up(Keys.CONTROL).perform(). Die ActionChains werden aus importiert selenium.webdriver.common.action_chains.
Java Xu

34

Warum nicht?

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

Die meisten Popup-Blocker werden diesen Versuch blockieren
Bert Lamb

1
wahrscheinlich sicher zum Testen, wo Sie die Kontrolle über Ihre Browsereinstellungen haben
Kernowcode

1
würde wahrscheinlich super funktionieren. chromedriver scheint alle Erweiterungen zu deaktivieren (dh Adblock)
Josh O'Bryan

4
Die Methode "Schlüssel senden" funktioniert nach der Aktualisierung auf Chrome 49.0.2623.75m nicht mehr für mich. Diese Methode funktioniert in dieser Chrome-Version.
Steven

6
Wenn Sie eine leere Seite in der Registerkarte öffnen möchten, können Siedriver.ExecuteScript("window.open('about:blank','_blank');");
Steven

12

So öffnen Sie eine neue Registerkarte mit JavascriptExecutor:

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

Steuert auf der Registerkarte gemäß Index:

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

Treibersteuerung auf der Hauptregisterkarte:

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

Wie wäre es mit 3 URLs? 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));Ich habe dies versucht, aber das Array aus der gebundenen Ausnahme herausgeholt. Wenn Sie eine Lösung kennen, lassen Sie es mich bitte wissen.
Cruisepandey

Ähnlich funktioniert es auch für die 3. Registerkarte. Darf ich wissen, wo genau eine Ausnahme ausgelöst wird (beim Schließen des Treibers)?
Ishita Shah

Nein, in dieser Zeile driver.switchTo().window(tabs.get(2));funktioniert dies einwandfrei, ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");aber ich habe keine Kontrolle, um zu Windows zu wechseln.
Cruisepandey


8

Sie können den folgenden Code mit Java mit Selenium WebDriver verwenden:

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

Mit JavaScript:

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

Nach dem Öffnen der neuen Registerkarte muss zu dieser Registerkarte gewechselt werden:

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

Die manuelle Operation Strg + T zum Öffnen eines neuen Tabs wurde hier implementiert
Ripon Al Wasim

@ Chandra Shekhar: Kannst du bitte meinen JS-Code oben ausprobieren?
Ripon Al Wasim

@ Shivam: Vielen Dank. Es ist gut zu hören, wie der Code funktioniert hat.
Ripon Al Wasim

5

Versuchen Sie dies für den FireFox-Browser.

/*  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

Der folgende Code öffnet den Link in einem neuen Fenster

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

1
Typ Objekt 'Keys' hat kein Attribut 'Akkord'
Robino

@Robino. Ich sehe es in der Schlüsselklasse (org.openqa.Selenium)
MrBCut

3

Fast alle Antworten hier sind veraltet.

WebDriver unterstützt jetzt das Öffnen von Registerkarten:

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

Öffnet einen neuen Tab. Das Öffnen eines Fensters ist eigentlich zum Standard geworden:

browser.manage.new_window(:window)

Die Registerkarte oder das Fenster wird nicht automatisch fokussiert. Um dorthin zu wechseln:

browser.switch_to.window new_tab

2

Verwenden Sie diesen Code, um mit Selenium WebDriver einen neuen Tab im vorhandenen Chrome-Browser zu öffnen:

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

Ja, das funktioniert gut. Öffnen Sie eine neue URL in derselben Registerkarte wie die vorhandene URL. Dies ist gut für viele Link-Tests geeignet, da nicht viele Ressourcen verwendet werden.
John Peters

2

Ich hatte eine Weile Probleme, einen neuen Tab in Chrom zu öffnen. Auch driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");hat bei mir nicht funktioniert.

Ich fand heraus, dass es nicht ausreicht, dass sich Selen auf den Treiber konzentriert, Windows muss auch das Fenster vorne haben.

Meine Lösung bestand darin, eine Warnung auf Chrome aufzurufen, die das Fenster nach vorne bringt und dann den Befehl ausführt. Beispielcode:

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

1

Ich verwende Selenium 2.52.0 in Java und Firefox 44.0.2. Leider hat keine der oben genannten Lösungen für mich funktioniert. Das Problem ist, wenn ich einen Treiber aufrufe. GetWindowHandles () bekomme ich immer 1 einzelnes Handle. Irgendwie macht das für mich Sinn, da Firefox ein einzelner Prozess ist und jede Registerkarte kein separater Prozess ist. Aber vielleicht irre ich mich. Jedenfalls versuche ich meine eigene Lösung zu schreiben:

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

Ich habe Strg + t-Kombination verwendet, um eine neue Registerkarte zu öffnen, Strg + w, um sie zu schließen, und um zur ursprünglichen Registerkarte zurückzukehren, habe ich Strg + 1 (die erste Registerkarte) verwendet. Mir ist bewusst, dass meine Lösung nicht perfekt oder sogar gut ist, und ich würde auch gerne mit dem Schalter switchTo des Fahrers wechseln, aber wie ich schrieb, war dies nicht möglich, da ich nur einen Griff hatte. Vielleicht ist dies für jemanden mit der gleichen Situation hilfreich.


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

1

Wie öffne ich einen neuen Tab mit Selenium WebDriver mit Java für 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);

Der obige Code deaktiviert die ersten Erweiterungen und die Verwendung der neuen Registerkarte "Roboterklasse" wird geöffnet.


1

Diese Codezeile öffnet eine neue Browser-Registerkarte mit dem Selenium-Webdriver

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

Wenn ich über Code lief, öffnete sich in Chrome ein neuer Tab. In Firefox wird jedoch ein neues Fenster geöffnet. In beiden Fällen unterscheidet sich der Window Handler für neu geöffnete. Ich denke also, ein Tab ist mehr oder weniger dasselbe wie ein Fenster. Natürlich unterscheidet sich das Inkognito-Fenster definitiv von der normalen Registerkarte eines Fensters.
MamathaMacherla

1

*JAVA

Ich empfehle zu verwenden JavascriptExecutor:

  • Neues leeres Fenster öffnen:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Öffnen Sie ein neues Fenster mit einer bestimmten URL:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Nach dem Import:

import org.openqa.selenium.JavascriptExecutor;

0

Gleiches Beispiel für 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

Wie öffne ich eine neue, aber was noch wichtiger ist, wie machst du Sachen in dieser neuen Registerkarte? Webdriver fügt nicht für jede Registerkarte ein neues WindowHandle hinzu und hat nur die Kontrolle über die erste Registerkarte. Nachdem Sie eine neue Registerkarte (Strg + Tab-Nummer) ausgewählt haben, setzen Sie .DefaultContent () auf den Treiber, um die sichtbare Registerkarte als die zu definieren, an der Sie arbeiten werden.

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

So öffnen Sie mit Selenium WebDriver eine neue Registerkarte im vorhandenen Firefox-Browser

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

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

Geben Sie in Zukunft einen Erklärungstext zusammen mit dem Code-Snippet an, damit Ihre Beiträge leichter verständlich werden.
Tyler Jandreau

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

In diesem vollständigen Beispiel erfahren Sie, wie Sie mehrere Registerkarten öffnen, zwischen den Registerkarten wechseln und am Ende alle Registerkarten schließen

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

Dieses Beispiel wird von dieser Webseite gegeben


0

Aufgrund eines Fehlers in https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 , obwohl webdriver.switchTo tatsächlich die Registerkarten wechselt, bleibt der Fokus auf der ersten Registerkarte. Sie können dies bestätigen, indem Sie nach dem switchWindow ein driver.get ausführen und feststellen, dass die zweite Registerkarte tatsächlich zur neuen URL und nicht zur ursprünglichen Registerkarte wechselt.

Im Moment herumarbeiten ist das, was @ yardening2 vorgeschlagen hat. Verwenden Sie js, um eine Warnung zu öffnen, und verwenden Sie dann den Webdriver, um sie zu akzeptieren.


0

Dieser Code funktioniert für mich (Selen 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

Frage : Wie öffne ich einen neuen Tab mit Selenium WebDriver mit Java?

Antwort : Nachdem Sie auf einen Link geklickt haben, öffnen Sie einen neuen Tab.

Wenn wir neu geöffnete Registerkarten verarbeiten möchten, müssen wir Registerkarten mit dem Befehl .switchTo (). Window () behandeln.

Wechseln Sie zu einer bestimmten Registerkarte, führen Sie dann den Vorgang aus und wechseln Sie zurück zur übergeordneten Registerkarte.

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

Selen unterstützt nicht das Öffnen neuer Registerkarten, sondern nur das Öffnen neuer Fenster. In jeder Hinsicht entspricht ein neues Fenster einer neuen Registerkarte.

Es gibt verschiedene Hacks, um das Problem zu umgehen, aber sie werden Ihnen auf lange Sicht andere Probleme bereiten.


0

Wenn Sie die neue Registerkarte öffnen möchten, können Sie diese verwenden

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

Wenn Sie den Link über die neue Registerkarte öffnen möchten, können Sie diese verwenden

mit JavascriptExecutor:

 public void openFromNewTab(WebElement element){
            ((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
        }

mit Aktionen:

 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

Umgang mit dem Browserfenster mit 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

Die Frage kann nicht beantwortet werden. Bei Ihrer Antwort geht es darum, zu einem bereits vorhandenen Fenster zu wechseln. OP hat gefragt, wie ein neues Fenster geöffnet werden soll.
Thomas Hirsch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.