Comment ouvrir un nouvel onglet avec Selenium WebDriver?

114

Comment ouvrir un nouvel onglet dans le navigateur Firefox existant à l'aide de Selenium WebDriver (alias Selenium 2)?

Bhakti Shah
la source
Quel langage de programmation utilisez-vous?
alecxe le
2
J'utilise java. J'ai une solution "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" et son fonctionnement parfaitement bien.
Bhakti Shah
Êtes-vous alors en mesure de contrôler le nouvel onglet? Selenium n'a pas de support pour les nouveaux onglets (il essaie d'ouvrir de nouvelles fenêtres à la place). Voir mes réponses stackoverflow.com/questions/14550360/… et stackoverflow.com/questions/17225911/… . Qu'essayez-vous de réaliser exactement?
Petr Janeček
Je voulais copier du texte, puis ouvrir un nouvel onglet et coller le même texte dans le nouvel onglet. Je n'ai pas essayé de contrôler le nouvel onglet mais cela fonctionne bien pour ce que je veux réaliser.
Bhakti Shah
J'ai fait la même chose en utilisant GetText () de cet élément, puis j'ai fait Driver.get (texte).
Bhakti Shah

Réponses:

53

Le code ci-dessous ouvrira le lien dans le nouvel onglet.

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

Le code ci-dessous ouvrira un nouvel onglet vide.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Nagaraju Jampani
la source
7
utilisez Keys.COMMAND au lieu de Keys.CONTROL si vous utilisez mac
nanospeck
2
Cette solution semble moins qu'optimale car elle dépend de raccourcis spécifiques au système d'exploitation (et peut-être spécifiques au navigateur) ... Au moins, si vous utilisez quelque chose comme JS window.open(), vous pouvez vous attendre à ce qu'il fonctionne sur de nombreuses plates-formes / navigateurs.
mkasberg
86

Juste pour tous ceux qui recherchent une réponse dans les liaisons Ruby / Python / C # (Selenium 2.33.0).

Notez que les clés réelles à envoyer dépendent de votre système d'exploitation, par exemple, Mac utilise COMMAND + t, au lieu de CONTROL + t.

Rubis

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();
        }
    }
}
Yi Zeng
la source
3
comment revenir à l'onglet précédent?
lurscher
11
WebDriver peut gérer plus d'un onglet - il les traite simplement comme des fenêtres séparées. Il vous suffit donc driver.switchTo().window(windowName);d'accéder à n'importe quel onglet ou fenêtre. De toute évidence, vous devez garder une trace du ou des noms de fenêtre comme d'habitude pour permettre de basculer entre eux.
Mark Rowlands
1
Pourriez-vous expliquer pourquoi vous récupérez un élément et envoyez le Ctrl-t à cet élément? Cela n'a aucun sens ... vous ne pouvez pas "Ctrl + t sur un élément Web"? Pourquoi ne pas simplement lancer de nouvelles actions (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Quelqu'un pourrait-il expliquer?
Brondahl
1
Cela ne fonctionne pas pour moi. J'ai essayé plusieurs façons différentes d'appuyer sur ctrl + t, dont aucune ne réussit à ouvrir un nouvel onglet.
Thayne
4
@Thayne un bogue ChromeDriver empêche CTRL + T de fonctionner. Vous pouvez utiliser CTRL + LMB comme solution de contournement. Voir code.google.com/p/chromedriver/issues/detail?id=903#c2 pour un exemple de code.
Gili
34

Pourquoi ne pas faire ça

driver.ExecuteScript("window.open('your url','_blank');");
kernowcode
la source
la plupart des bloqueurs de popup bloqueront cette tentative
Bert Lamb
1
probablement sans danger pour tester où vous contrôlez les paramètres de votre navigateur
kernowcode
1
fonctionnerait probablement très bien. chromedriver semble désactiver toutes les extensions (c'est-à-dire adblock)
Josh O'Bryan
4
La méthode d'envoi des clés ne fonctionne plus pour moi après la mise à jour vers Chrome 49.0.2623.75m, et cette méthode fonctionne sur cette version de Chrome.
Steven
6
Si vous souhaitez ouvrir une page vierge dans l'onglet, vous pouvezdriver.ExecuteScript("window.open('about:blank','_blank');");
Steven
12

Pour ouvrir un nouvel onglet à l'aide de JavascriptExecutor,

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

Contrôle sur l'onglet selon l'index:

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

Contrôle du pilote sur l'onglet principal:

driver.switchTo().window(tabs.get(0));
Ishita Shah
la source
Que diriez-vous de lancer 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));, J'ai essayé cela mais en sortant le tableau de l'exception liée, si vous connaissez une solution, veuillez me le faire savoir.
cruisepandey
Cela fonctionne de même pour le 3e onglet également. Puis-je savoir exactement où se produit l'exception (à la fermeture du pilote)?
Ishita Shah
Non, à cette ligne driver.switchTo().window(tabs.get(2));, cela fonctionne bien ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");mais je n'aurai aucun contrôle pour passer à Windows.
cruisepandey
9

Pour ouvrir une nouvelle fenêtre dans le pilote 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);

Pour basculer entre les onglets, lisez ici

Junaid Khan
la source
8

Vous pouvez utiliser le code suivant en utilisant Java avec Selenium WebDriver:

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

En utilisant JavaScript:

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

Après avoir ouvert un nouvel onglet, il doit passer à cet onglet:

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Ripon Al Wasim
la source
L'opération manuelle Ctrl + T pour ouvrir un nouvel onglet a été implémentée ici
Ripon Al Wasim
@ Chandra Shekhar: Pouvez-vous essayer mon code JS ci-dessus?
Ripon Al Wasim le
@ Shivam: Merci beaucoup. C'est bon à entendre pendant que le code fonctionnait.
Ripon Al Wasim
5

Essayez ceci pour le navigateur 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));
}
Prasanth RJ
la source
3

Le code ci-dessous ouvrira le lien dans une nouvelle fenêtre

String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
Nagaraju Jampani
la source
1
L'objet de type 'Keys' n'a pas d'attribut 'accord'
Robino
@Robino. Je le vois dans la classe Keys (org.openqa.Selenium)
MrBCut
3

Presque toutes les réponses ici sont obsolètes.

WebDriver prend désormais en charge l'ouverture des onglets:

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

Ouvre un nouvel onglet. Ouvrir une fenêtre est en fait devenu le cas non standard:

browser.manage.new_window(:window)

L'onglet ou la fenêtre ne sera pas automatiquement focalisé. Pour y accéder:

browser.switch_to.window new_tab
Matthias Winkelmann
la source
2

Pour ouvrir un nouvel onglet dans le navigateur Chrome existant à l'aide de Selenium WebDriver, vous pouvez utiliser ce code:

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);
user2000197
la source
Oui, cela fonctionne bien, ouvrez une nouvelle URL dans le même onglet que l'url existante, bien pour de nombreux tests de liens car cela n'utilise pas beaucoup de ressources.
John Peters
2

J'ai eu du mal à ouvrir un nouvel onglet dans Chrome pendant un moment. Même driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");n'a pas fonctionné pour moi.

J'ai découvert qu'il ne suffit pas que le sélénium se concentre sur le pilote, Windows doit également avoir la fenêtre à l'avant.

Ma solution était d'appeler une alerte sur chrome qui ramènerait la fenêtre au premier plan, puis exécuterait la commande. exemple de code:

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

J'utilise Selenium 2.52.0 dans Java et Firefox 44.0.2. Malheureusement, aucune des solutions ci-dessus n'a fonctionné pour moi. Le problème est que si j'appelle driver.getWindowHandles (), j'obtiens toujours une seule poignée. Cela a du sens pour moi car Firefox est un processus unique et chaque onglet n'est pas un processus distinct. Mais peut-être que je me trompe. Quoi qu'il en soit, j'essaye d'écrire ma propre solution:

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

J'ai utilisé la combinaison Ctrl + t pour ouvrir un nouvel onglet, Ctrl + w pour le fermer et pour revenir à l'onglet d'origine, j'ai utilisé Ctrl + 1 (le premier onglet). Je suis conscient que ma solution n'est ni parfaite ni même bonne et j'aimerais aussi passer avec le commutateur du conducteur pour appeler, mais comme je l'ai écrit, ce n'était pas possible car je n'avais qu'une seule poignée. Peut-être que cela sera utile à quelqu'un avec la même situation.

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

Comment ouvrir un nouvel onglet en utilisant Selenium WebDriver avec Java pour 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);

Le code ci-dessus désactivera les premières extensions et le nouvel onglet en utilisant la classe de robot s'ouvrira.

Nikhil Shah
la source
1

Cette ligne de code ouvrira un nouvel onglet de navigateur à l'aide de sélénium webdriver

((JavascriptExecutor)getDriver()).executeScript("window.open()");
khaleefa shaik
la source
Lorsque j'ai exécuté le code ci-dessus, dans Chrome, un nouvel onglet a été ouvert. Cependant, dans Firefox, une nouvelle fenêtre s'ouvre. Dans les deux cas, le gestionnaire de fenêtres est différent pour les nouveaux. Je pense donc qu'un onglet est plus ou moins identique à une fenêtre. Bien sûr, la fenêtre de navigation privée est définitivement différente de l'onglet normal d'une fenêtre.
MamathaMacherla
1

*JAVA

Je recommande d'utiliser JavascriptExecutor:

  • Ouvrez une nouvelle fenêtre vide:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Ouvrir une nouvelle fenêtre avec une URL spécifique:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Après l'importation:

import org.openqa.selenium.JavascriptExecutor;
frianH
la source
0

Même exemple pour nodejs:

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

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

Comment ouvrir un nouveau, mais plus important encore, comment faites-vous des choses dans ce nouvel onglet? Webdriver n'ajoute pas de nouveau WindowHandle pour chaque onglet et ne contrôle que le premier onglet. Ainsi, après avoir sélectionné un nouvel onglet (Contrôle + Numéro de l'onglet), définissez .DefaultContent () sur le pilote pour définir l'onglet visible comme celui sur lequel vous allez travailler.

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()
BClaydon
la source
0

Pour ouvrir un nouvel onglet dans le navigateur Firefox existant à l'aide de Selenium WebDriver

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t"); 
Vickisys
la source
0
 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
Alex Mathew
la source
À l'avenir, fournissez un texte d'explication avec l'extrait de code pour rendre vos publications plus faciles à comprendre.
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));
Rajan.M
la source
0

consultez cet exemple complet pour comprendre comment ouvrir plusieurs onglets et basculer entre les onglets et à la fin fermer tous les onglets

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

Cet exemple est donné par cette page web

anuja jain
la source
0

En raison d'un bug dans https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 même si webdriver.switchTo change réellement d'onglet, le focus est laissé sur le premier onglet. Vous pouvez le confirmer en faisant un driver.get après le switchWindow et voir que le deuxième onglet va réellement vers la nouvelle URL et non vers l'onglet d'origine.

Pour l'instant, c'est ce que @ yardening2 a suggéré. Utilisez js pour ouvrir une alerte, puis utilisez Webdriver pour l'accepter.

désolé
la source
0

Ce code fonctionne pour moi (sélénium 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();
}
Giang Phan
la source
0

Question : Comment ouvrir un nouvel onglet à l'aide de Selenium WebDriver avec Java?

Réponse : Après avoir cliqué sur n'importe quel lien, ouvrez un nouvel onglet.

Si nous voulons gérer l'onglet nouvellement ouvert, nous devons gérer l'onglet en utilisant la commande .switchTo (). Window ().

Basculez vers un onglet particulier, puis effectuez l'opération et revenez à l'onglet parent.

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

    }

}
Sandeep Shewale
la source
0

Selenium ne prend pas en charge l'ouverture de nouveaux onglets, il ne prend en charge que l'ouverture de nouvelles fenêtres. À toutes fins utiles, une nouvelle fenêtre est de toute façon fonctionnellement équivalente à un nouvel onglet.

Il existe divers hacks pour contourner le problème, mais ils vont vous causer d'autres problèmes à long terme.

Ardesco
la source
0

Si vous souhaitez ouvrir le nouvel onglet, vous pouvez utiliser ceci

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

Si vous souhaitez ouvrir le lien depuis le nouvel onglet, vous pouvez utiliser ceci

avec JavascriptExecutor:

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

avec des actions:

 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();
Norayr Sargsyan
la source
-1
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");// open in new tab
driver.get("ur link");
liki
la source
-1

Gestion de la fenêtre du navigateur à l'aide de 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
Jainish Kapadia
la source
Ne répond pas à la question. Votre réponse concerne le passage à une fenêtre déjà existante, OP a demandé comment en ouvrir une nouvelle.
Thomas Hirsch