¿Cómo abrir una nueva pestaña usando Selenium WebDriver?

114

¿Cómo abrir una nueva pestaña en el navegador Firefox existente usando Selenium WebDriver (también conocido como Selenium 2)?

Bhakti Shah
fuente
¿Que lenguaje de programación estas usando?
alecxe
2
Yo uso java. Tengo una solución "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" y está funcionando totalmente bien.
Bhakti Shah
¿Entonces puede controlar la nueva pestaña? Selenium no admite pestañas nuevas (en su lugar, intenta abrir nuevas ventanas). Vea mis respuestas stackoverflow.com/questions/14550360/… y stackoverflow.com/questions/17225911/… . ¿Qué estás tratando de lograr exactamente?
Petr Janeček
Quería copiar algo de texto y luego abrir una nueva pestaña y pegar el mismo texto en la nueva pestaña. No he intentado controlar la nueva pestaña, pero funciona bien para lo que quiero lograr.
Bhakti Shah
Hice lo mismo usando GetText () de ese elemento y luego hice Driver.get (text).
Bhakti Shah

Respuestas:

53

El siguiente código abrirá el enlace en una nueva pestaña.

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

El siguiente código abrirá una nueva pestaña vacía.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Nagaraju Jampani
fuente
7
use Keys.COMMAND en lugar de Keys.CONTROL si está usando mac
nanospeck
2
Esta solución parece menos que óptima ya que depende de accesos directos específicos del sistema operativo (y quizás específicos del navegador) ... Al menos, si usa algo como JS window.open(), puede esperar que funcione en muchas plataformas / navegadores.
mkasberg
86

Solo para cualquier otra persona que esté buscando una respuesta en enlaces Ruby / Python / C # (Selenium 2.33.0).

Tenga en cuenta que las claves reales para enviar dependen de su sistema operativo, por ejemplo, Mac usa COMMAND + t, en lugar de CONTROL + t.

Rubí

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

Pitón

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
fuente
3
¿Cómo se vuelve a la pestaña anterior?
lurscher
11
WebDriver puede manejar más de una pestaña; simplemente las trata como ventanas separadas. Así que solo necesitas driver.switchTo().window(windowName);acceder a cualquier pestaña o ventana. Obviamente, deberá realizar un seguimiento de los nombres de las ventanas de forma normal para permitir el cambio entre ellos.
Mark Rowlands
1
¿Podría explicar por qué está recuperando un elemento y enviando Ctrl-t a ese elemento? Eso no tiene ningún sentido ... ¿no puedes "Ctrl + t en un elemento web"? ¿Por qué no simplemente ejecutar acciones nuevas (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); ¿Alguien podría explicarme?
Brondahl
1
Esto no me funciona. Probé varias formas diferentes de presionar ctrl + t, ninguna de las cuales logró abrir una nueva pestaña.
Thayne
4
@Thayne un error de ChromeDriver evita que CTRL + T funcione. Puede usar CTRL + LMB como solución. Consulte code.google.com/p/chromedriver/issues/detail?id=903#c2 para obtener un código de muestra.
Gili
34

Porque no hacer esto

driver.ExecuteScript("window.open('your url','_blank');");
kernowcode
fuente
la mayoría de los bloqueadores de ventanas emergentes bloquearán este intento
Bert Lamb
1
probablemente seguro para probar donde usted tiene el control de la configuración de su navegador
kernowcode
1
probablemente funcionaría muy bien. chromedriver parece deshabilitar todas las extensiones (es decir, adblock)
Josh O'Bryan
4
El método de envío de claves ya no me funciona después de actualizar a Chrome 49.0.2623.75m, y este método funciona en esa versión de Chrome.
Steven
6
Si desea abrir una página en blanco en la pestaña, podríadriver.ExecuteScript("window.open('about:blank','_blank');");
Steven
12

Para abrir una nueva pestaña usando JavascriptExecutor,

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

Controlará en la pestaña según el índice:

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

Control del conductor en la pestaña principal:

driver.switchTo().window(tabs.get(0));
Ishita Shah
fuente
¿Qué tal lanzar 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));, He intentado esto pero obteniendo una matriz fuera de la excepción vinculada, si conoce alguna solución, hágamelo saber.
Cruisepandey
También funciona de manera similar para la tercera pestaña. ¿Puedo saber dónde arroja exactamente la excepción (al cerrar el controlador)?
Ishita Shah
No, en esta línea driver.switchTo().window(tabs.get(2));, esto funciona bien ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");pero no tendré ningún control para cambiar a Windows.
Cruisepandey
9

Para abrir una nueva ventana en el controlador de 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);

Para cambiar entre pestañas, lea aquí

Junaid Khan
fuente
8

Puede usar el siguiente código usando Java con Selenium WebDriver:

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

Utilizando JavaScript:

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

Después de abrir una nueva pestaña, debe cambiar a esa pestaña:

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Ripon Al Wasim
fuente
La operación manual Ctrl + T para abrir una nueva pestaña se implementó aquí
Ripon Al Wasim
@ Chandra Shekhar: ¿Puedes probar mi código JS anterior?
Ripon Al Wasim
@ Shivam: Muchas gracias. Es bueno saber que el código funcionó.
Ripon Al Wasim
5

Pruebe esto para el navegador 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
fuente
3

El siguiente código abrirá el enlace en una nueva ventana

String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
Nagaraju Jampani
fuente
1
El objeto de tipo 'Keys' no tiene atributo 'acorde'
Robino
@Robino. Lo veo en la clase de claves (org.openqa.Selenium)
MrBCut
3

Casi todas las respuestas aquí están desactualizadas.

WebDriver ahora tiene soporte para abrir pestañas:

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

Abrirá una nueva pestaña. Abrir una ventana en realidad se ha convertido en un caso no estándar:

browser.manage.new_window(:window)

La pestaña o ventana no se enfocará automáticamente. Para cambiar a él:

browser.switch_to.window new_tab
Matthias Winkelmann
fuente
2

Para abrir una nueva pestaña en el navegador Chrome existente usando Selenium WebDriver, puede usar este código:

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);
usuario2000197
fuente
Sí, esto funciona bien, abre una nueva URL en la misma pestaña de la URL existente, bueno para muchas pruebas de enlaces porque no usa muchos recursos.
John Peters
2

Tuve problemas para abrir una nueva pestaña en Chrome por un tiempo. Inclusodriver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t"); no funcionó para mí.

Descubrí que no es suficiente que el selenio se centre en el controlador, Windows también debe tener la ventana en la parte delantera.

Mi solución fue invocar una alerta en Chrome que llevaría la ventana al frente y luego ejecutaría el comando. Código de muestra:

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

Estoy usando Selenium 2.52.0 en Java y Firefox 44.0.2. Desafortunadamente, ninguna de las soluciones anteriores funcionó para mí. El problema es que si llamo a driver.getWindowHandles () siempre obtengo 1 identificador único. De alguna manera esto tiene sentido para mí, ya que Firefox es un proceso único y cada pestaña no es un proceso separado. Pero tal vez me equivoque. De todos modos trato de escribir mi propia solución:

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

Usé la combinación Ctrl + t para abrir una nueva pestaña, Ctrl + w para cerrarla y para volver a la pestaña original usé Ctrl + 1 (la primera pestaña). Soy consciente de que la solución mía no es perfecta o ni siquiera buena y también me gustaría cambiar con el interruptor del conductor para llamar, pero como escribí no fue posible porque solo tenía un identificador. Quizás esto sea útil para alguien con la misma situación.

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

¿Cómo abrir una nueva pestaña usando Selenium WebDriver con Java para 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);

El código anterior deshabilitará las primeras extensiones y se abrirá una nueva pestaña usando la clase de robot.

Nikhil Shah
fuente
1

Esta línea de código abrirá una nueva pestaña del navegador usando selenium webdriver

((JavascriptExecutor)getDriver()).executeScript("window.open()");
khaleefa shaik
fuente
Cuando ejecuté el código anterior, en Chrome se abrió una nueva pestaña. Sin embargo, en Firefox se abre una nueva ventana. En ambos casos, el controlador de ventana es diferente para los recién abiertos. Entonces creo que una pestaña es más o menos lo mismo que una ventana. Por supuesto, la ventana de incógnito es definitivamente diferente de la pestaña normal de una ventana.
MamathaMacherla
1

*JAVA

Recomiendo usar JavascriptExecutor:

  • Abrir nueva ventana en blanco:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Abre una nueva ventana con una URL específica:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Importación siguiente:

import org.openqa.selenium.JavascriptExecutor;
frianH
fuente
0

Mismo ejemplo para 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
fuente
0

¿Cómo abrir una nueva pestaña, pero más importante aún, cómo se hacen las cosas en esa nueva pestaña? Webdriver no agrega un nuevo WindowHandle para cada pestaña, y solo tiene el control de la primera pestaña. Entonces, después de seleccionar una nueva pestaña (Control + Número de pestaña), configure .DefaultContent () en el controlador para definir la pestaña visible como la que va a trabajar.

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
fuente
0

Para abrir una nueva pestaña en el navegador Firefox existente usando Selenium WebDriver

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t"); 
vickisys
fuente
0
 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
Alex Mathew
fuente
En el futuro, proporcione un texto explicativo junto con el fragmento de código para que sus publicaciones sean más fáciles de entender.
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
fuente
0

consulte este ejemplo completo para comprender cómo abrir varias pestañas y cambiar entre las pestañas y al final cerrar todas las pestañas

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

Este ejemplo lo da esta página web

anuja jain
fuente
0

Debido a un error en https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 aunque webdriver.switchTo en realidad cambia de pestaña, el foco se deja en la primera pestaña. Puede confirmar esto haciendo un driver.get después de switchWindow y ver que la segunda pestaña realmente va a la nueva URL y no a la pestaña original.

Trabajar por ahora es lo que sugirió @ yardening2. Use js para abrir una alerta y luego use webdriver para aceptarla.

anilwanted
fuente
0

Este código funciona para mí (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();
}
Giang Phan
fuente
0

Pregunta : ¿Cómo abrir una nueva pestaña usando Selenium WebDriver con Java?

Respuesta : Después de hacer clic en cualquier enlace, abra una nueva pestaña.

Si queremos manejar la pestaña recién abierta, entonces tenemos que manejar la pestaña usando el comando .switchTo (). Window ().

Cambie a la pestaña particular, luego realice la operación y vuelva a la pestaña principal.

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
fuente
0

Selenium no admite la apertura de nuevas pestañas, solo admite la apertura de nuevas ventanas. Para todos los efectos, una nueva ventana es funcionalmente equivalente a una nueva pestaña de todos modos.

Hay varios trucos para solucionar el problema, pero a largo plazo le causarán otros problemas.

Ardesco
fuente
0

Si desea abrir la nueva pestaña, puede usar esta

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

Si desea abrir el enlace desde la nueva pestaña, puede usar este

con JavascriptExecutor:

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

con acciones:

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

Manejo de la ventana del navegador usando 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
fuente
No responde a la pregunta. Su respuesta se trata de cambiar a una ventana ya existente, OP preguntó cómo abrir una nueva.
Thomas Hirsch