Come aprire una nuova scheda utilizzando Selenium WebDriver?


114

Come aprire una nuova scheda nel browser Firefox esistente utilizzando Selenium WebDriver (noto anche come Selenium 2)?


Che linguaggio di programmazione stai usando?
alecxe

2
Uso java. Ho una soluzione "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" e funziona perfettamente.
Bhakti Shah

Sei quindi in grado di controllare la nuova scheda? Selenium non supporta le nuove schede (cerca invece di aprire nuove finestre). Vedi le mie risposte stackoverflow.com/questions/14550360/… e stackoverflow.com/questions/17225911/… . Cosa stai cercando di ottenere esattamente?
Petr Janeček

Volevo copiare del testo e quindi aprire una nuova scheda e incollare lo stesso testo nella nuova scheda. Non ho provato a controllare la nuova scheda ma funziona bene per quello che voglio ottenere.
Bhakti Shah

Ho fatto la stessa cosa usando GetText () di quell'elemento e poi ho fatto Driver.get (testo).
Bhakti Shah

Risposte:


53

Il codice seguente aprirà il collegamento in una nuova scheda.

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

Il codice seguente aprirà una nuova scheda vuota.

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

7
usa Keys.COMMAND invece di Keys.CONTROL se stai usando mac
nanospeck

2
Questa soluzione sembra meno che ottimale poiché dipende da scorciatoie specifiche del sistema operativo (e forse specifiche del browser) ... Almeno, se usi qualcosa come JS window.open(), puoi aspettarti che funzioni su molte piattaforme / browser.
mkasberg

86

Solo per chiunque altro stia cercando una risposta nei collegamenti Ruby / Python / C # (Selenium 2.33.0).

Nota che le chiavi effettive da inviare dipendono dal tuo sistema operativo, ad esempio, Mac utilizza COMMAND + t, invece di CONTROL + t.

Rubino

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

Pitone

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

3
come torni alla scheda precedente?
Lurscher

11
WebDriver può gestire più di una scheda: le tratta semplicemente come finestre separate. Quindi devi solo driver.switchTo().window(windowName);accedere a qualsiasi scheda o finestra. Ovviamente, dovresti tenere traccia dei nomi delle finestre normalmente per consentire il passaggio da uno all'altro.
Mark Rowlands

1
Potresti spiegare perché stai recuperando un elemento e inviando Ctrl-t a quell'elemento? Non ha alcun senso ... non puoi "Ctrl + t su un elemento web"? Perché non eseguire semplicemente nuove azioni (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Per favore qualcuno potrebbe spiegare?
Brondahl

1
Questo non funziona per me. Ho provato diversi modi per premere ctrl + t, nessuno dei quali riesce ad aprire una nuova scheda.
Thayne

4
@Thayne un bug di ChromeDriver impedisce il funzionamento di CTRL + T. È possibile utilizzare CTRL + LMB come soluzione alternativa. Vedi code.google.com/p/chromedriver/issues/detail?id=903#c2 per il codice di esempio.
Gili

34

Perché non farlo

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

la maggior parte dei blocchi popup bloccherà questo tentativo
Bert Lamb,

1
probabilmente sicuro per testare dove hai il controllo delle impostazioni del tuo browser
kernowcode

1
probabilmente funzionerebbe benissimo. Chromedriver sembra disabilitare tutte le estensioni (es. blocco annunci)
Josh O'Bryan

4
Il metodo di invio delle chiavi non funziona più per me dopo l'aggiornamento a Chrome 49.0.2623.75m e questo metodo funziona su quella versione di Chrome.
Steven

6
Se vuoi aprire una pagina vuota nella scheda, potrestidriver.ExecuteScript("window.open('about:blank','_blank');");
Steven

12

Per aprire una nuova scheda utilizzando JavascriptExecutor,

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

Controllerà sulla scheda come in base all'indice:

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

Controllo del driver nella scheda principale:

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

Che ne dici di lanciare 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));, Ho provato questo ma ottenendo array fuori dall'eccezione vincolata, se conosci qualche soluzione per favore fatemelo sapere.
cruisepandey

Funziona in modo simile anche per la terza scheda. Posso sapere dove viene generata esattamente l'eccezione (alla chiusura del driver)?
Ishita Shah

No, su questa riga driver.switchTo().window(tabs.get(2));, funziona bene ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");ma non avrò alcun controllo per passare a Windows.
cruisepandey

9

Per aprire una nuova finestra in Chrome Driver.

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

Per passare da una scheda all'altra, leggi qui


8

È possibile utilizzare il codice seguente utilizzando Java con Selenium WebDriver:

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

Utilizzando JavaScript:

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

Dopo aver aperto una nuova scheda, è necessario passare a quella scheda:

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

L'operazione manuale Ctrl + T per aprire una nuova scheda è stata implementata qui
Ripon Al Wasim

@ Chandra Shekhar: puoi provare il mio codice JS sopra?
Ripon Al Wasim

@ Shivam: grazie mille. È bello sentire come funziona il codice.
Ripon Al Wasim

5

Prova questo per il browser 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));
}

3

Il codice sottostante aprirà il collegamento in una nuova finestra

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

1
l'oggetto di tipo "Chiavi" non ha attributo "accordo"
Robino

@Robino. Lo vedo nella classe Keys (org.openqa.Selenium)
MrBCut

3

Quasi tutte le risposte qui sono obsolete.

WebDriver ora ha il supporto per l'apertura delle schede:

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

Si aprirà una nuova scheda. Aprire una finestra è diventato effettivamente il caso non standard:

browser.manage.new_window(:window)

La scheda o la finestra non sarà automaticamente focalizzata. Per passare ad esso:

browser.switch_to.window new_tab

2

Per aprire una nuova scheda nel browser Chrome esistente utilizzando Selenium WebDriver puoi utilizzare questo codice:

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

Sì, funziona bene apri un nuovo URL nella stessa scheda dell'URL esistente, buono per molti test di collegamento perché non utilizza molte risorse.
John Peters

2

Ho avuto problemi ad aprire una nuova scheda in Chrome per un po '. Anchedriver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t"); per me non ha funzionato.

Ho scoperto che non è sufficiente che il selenio si concentri sul driver, anche Windows deve avere la finestra nella parte anteriore.

La mia soluzione era richiamare un avviso su Chrome che avrebbe portato la finestra in primo piano e quindi eseguire il comando. codice di esempio:

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

1

Sto usando Selenium 2.52.0 in Java e Firefox 44.0.2. Purtroppo nessuna delle soluzioni di cui sopra ha funzionato per me. Il problema è che se chiamo driver.getWindowHandles () ottengo sempre 1 singolo handle. In qualche modo questo ha senso per me poiché Firefox è un processo singolo e ogni scheda non è un processo separato. Ma forse mi sbaglio. Comunque provo a scrivere la mia soluzione:

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

Ho usato la combinazione Ctrl + t per aprire una nuova scheda, Ctrl + w per chiuderla e per tornare alla scheda originale ho usato Ctrl + 1 (la prima scheda). Sono consapevole che la mia soluzione non è perfetta o addirittura buona e vorrei anche cambiare con il commutatore dell'autista To call, ma come ho scritto non era possibile in quanto avevo una sola maniglia. Forse questo sarà utile a qualcuno con la stessa situazione.


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

1

Come aprire una nuova scheda utilizzando Selenium WebDriver con Java per 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);

Il codice sopra disabiliterà le prime estensioni e si aprirà una nuova scheda utilizzando la classe robot.


1

Questa riga di codice aprirà una nuova scheda del browser utilizzando il webdriver selenio

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

Quando ho eseguito il codice sopra, in Chrome è stata aperta una nuova scheda. Tuttavia in Firefox si apre una nuova finestra. In entrambi i casi il gestore delle finestre è diverso per quelli appena aperti. Quindi penso che una scheda sia più o meno uguale a una finestra. Ovviamente, la finestra di navigazione in incognito è decisamente diversa dalla normale scheda di una finestra.
MamathaMacherla

1

*GIAVA

Consiglio di utilizzare JavascriptExecutor:

  • Apri una nuova finestra vuota:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Apri una nuova finestra con un URL specifico:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Dopo l'importazione:

import org.openqa.selenium.JavascriptExecutor;

0

Stesso esempio per 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

Come si apre una nuova scheda, ma soprattutto come si fanno le cose in quella nuova scheda? Webdriver non aggiunge un nuovo WindowHandle per ogni scheda e ha solo il controllo della prima scheda. Quindi, dopo aver selezionato una nuova scheda (Control + Tab Number) imposta .DefaultContent () sul driver per definire la scheda visibile come quella su cui lavorerai.

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

Per aprire una nuova scheda nel browser Firefox esistente utilizzando Selenium WebDriver

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

In futuro, fornisci del testo esplicativo insieme allo snippet di codice per rendere i tuoi post più facili da capire.
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

controlla questo esempio completo per capire come aprire più schede e passare da una scheda all'altra e alla fine chiudere tutte le schede

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

Questo esempio è fornito da questa pagina web


0

A causa di un bug in https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 anche se webdriver.switchTo in realtà cambia scheda, lo stato attivo è lasciato sulla prima scheda. Puoi confermarlo facendo un driver.get dopo switchWindow e vedrai che la seconda scheda va effettivamente al nuovo URL e non alla scheda originale.

Per ora aggirare è ciò che @ yardening2 ha suggerito. Usa js per aprire un avviso e poi usa webdriver per accettarlo.


0

Questo codice funziona per me (selenio 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

Domanda : come aprire una nuova scheda utilizzando Selenium WebDriver con Java?

Risposta : Dopo aver fatto clic su qualsiasi collegamento, aprire una nuova scheda.

Se vogliamo gestire la scheda aperta di recente, dobbiamo gestire la scheda utilizzando il comando .switchTo (). Window ().

Passa a una scheda particolare, quindi esegui l'operazione e torna alla scheda principale.

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

Il selenio non supporta l'apertura di nuove schede, supporta solo l'apertura di nuove finestre. A tutti gli effetti una nuova finestra è comunque funzionalmente equivalente a una nuova scheda.

Ci sono vari hack per aggirare il problema, ma a lungo termine ti causeranno altri problemi.


0

Se vuoi aprire la nuova scheda puoi usarla

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

Se vuoi aprire il link dalla nuova scheda puoi usare questo

con JavascriptExecutor:

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

con azioni:

 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

Gestione della finestra del browser utilizzando 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

Non riesce a rispondere alla domanda. La tua risposta riguarda il passaggio a una finestra già esistente, OP ha chiesto come aprirne una nuova.
Thomas Hirsch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.