web-dev-qa-db-fra.com

Comment ouvrir un nouvel onglet avec Selenium WebDriver?

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

82
Bhakti Shah

Le code ci-dessous ouvrira le lien dans un 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);
35
Nagaraju Jampani

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

Notez que les clés à 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();
        }
    }
}
75
Yi Zeng

Pourquoi ne pas faire ça

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

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 passer d'un onglet à l'autre, lisez ici

5
Junaid Khan

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));
}
5
Prasanth RJ

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()");
4
Ripon Al Wasim

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);
3
Nagaraju Jampani

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

Cette ligne de code ouvrira un nouvel onglet de navigateur à l'aide de Selenium Webdriver.

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

Pour ouvrir un nouvel onglet avec JavascriptExecutor,  

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

Va contrôler 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));
1
Ishita Shah

J'utilise Selenium 2.52.0 en 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 (), je reçois toujours un seul descripteur. En quelque sorte, cela me semble logique puisque Firefox est un processus unique et que chaque onglet n’est pas un processus séparé. Mais peut-être que je me trompe. Quoi qu'il en soit, j'essaie 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 la solution proposée n’est pas parfaite ni bonne, et j’aimerais également passer d’un appel du conducteur à l’autre, mais comme j’ai écrit, cela n’était pas possible car je n’avais qu’un seul manche. Peut-être que cela sera utile à quelqu'un dans la même situation. 

1
Gico

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

Le code ci-dessus désactive les premières extensions et, à l'aide de la classe robot, un nouvel onglet s'ouvre.

1
Nikhil Shah

J'ai eu du mal à ouvrir un nouvel onglet en 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 suffisait pas que Selenium se concentre sur le pilote, Windows devait également avoir la fenêtre à l'avant.

Ma solution consistait à appeler une alerte sur Chrome qui ferait apparaître la fenêtre, puis à exécuter la commande. exemple de code:

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

Ce code fonctionne pour moi (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();
}
0
Giang Phan

Question : Comment ouvrir un nouvel onglet avec Selenium WebDriver avec Java?

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

Si nous voulons gérer un onglet récemment ouvert, nous devons le faire en utilisant la commande .switchTo (). Window ()

Basculez vers un onglet particulier, puis effectuez l'opération et revenez dans 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));

    }

}
0
sandeep shewale

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 néanmoins équivalente à un nouvel onglet.

Il existe plusieurs méthodes pour contourner le problème, mais elles vous poseront d’autres problèmes à long terme.

0
Ardesco

cochez cet exemple complet pour comprendre comment ouvrir plusieurs onglets, basculer d'un onglet à l'autre et 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

0
anuja jain

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"); 
0
vickisys
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

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

driver.switchTo().window(tabs.get(0));
0
Rajan.M
 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
0
Alex Mathew

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

Comment ouvrir une nouvelle page, 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. Ainsi, après avoir sélectionné un nouvel onglet (numéro de contrôle + onglet), définissez .DefaultContent () sur le pilote pour définir l'onglet visible comme étant 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()
0
BClaydon

En raison d'un bogue dans https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 même si webdriver.switchTo change d'onglet, le focus reste sur le premier. Vous pouvez le confirmer en exécutant un fichier driver.get après la fenêtre switchWindow et en vous assurant que le deuxième onglet est en fait dirigé vers la nouvelle URL et non vers l'onglet d'origine.

Pour le moment, c’est ce que @ yardening2 a suggéré… .. Utilisez js pour ouvrir une alerte, puis utilisez webdriver pour l’accepter.

0
anilwanted