Como abrir uma nova aba usando Selenium WebDriver?

114

Como abrir uma nova guia no navegador Firefox existente usando Selenium WebDriver (também conhecido como Selenium 2)?

Bhakti Shah
fonte
Qual linguagem de programação você está usando?
alecxe
2
Eu uso java. Eu tenho uma solução "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" e está funcionando perfeitamente bem.
Bhakti Shah
Você consegue controlar a nova guia? Selenium não tem suporte para novas guias (ele tenta abrir novas janelas em vez disso). Veja minhas respostas stackoverflow.com/questions/14550360/… e stackoverflow.com/questions/17225911/… . O que exatamente você está tentando alcançar?
Petr Janeček
Eu queria copiar algum texto e, em seguida, abrir uma nova guia e colar o mesmo texto na nova guia. Não tentei controlar a nova guia, mas ela funciona bem para o que desejo alcançar.
Bhakti Shah
Eu fiz a mesma coisa usando GetText () daquele elemento e então fiz Driver.get (text).
Bhakti Shah

Respostas:

53

O código abaixo abrirá o link em uma nova aba.

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

O código abaixo abrirá uma nova guia vazia.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Nagaraju Jampani
fonte
7
use Keys.COMMAND em vez de Keys.CONTROL se você estiver usando mac
nanospeck
2
Esta solução parece menos do que ideal, pois depende de atalhos específicos do sistema operacional (e talvez específicos do navegador) ... Pelo menos, se você usar algo como JS window.open(), pode esperar que funcione em muitas plataformas / navegadores.
mkasberg
86

Apenas para qualquer pessoa que esteja procurando uma resposta em ligações Ruby / Python / C # (Selenium 2.33.0).

Observe que as chaves reais a serem enviadas dependem do seu sistema operacional, por exemplo, o Mac usa COMMAND + t, em vez de CONTROL + t.

Rubi

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ão

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
fonte
3
como você volta para a guia anterior?
lurscher
11
O WebDriver pode lidar com mais de uma guia - ele simplesmente as trata como janelas separadas. Então, você só precisa driver.switchTo().window(windowName);acessar qualquer guia ou janela. Obviamente, você precisa manter o controle dos nomes das janelas normalmente para permitir a alternância entre eles.
Mark Rowlands
1
Você poderia explicar por que está recuperando um elemento e enviando Ctrl-t para esse elemento? Isso não faz sentido ... você não pode "Ctrl + t em um elemento da web"? Por que não apenas executar novas Actions (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Por favor, alguém poderia explicar?
Brondahl 01 de
1
Isso não funciona para mim. Eu tentei várias maneiras diferentes de pressionar ctrl + t, nenhuma das quais conseguiu abrir uma nova guia.
Thayne
4
@Thayne um bug do ChromeDriver impede que CTRL + T funcione. Você pode usar CTRL + LMB como uma solução alternativa. Consulte code.google.com/p/chromedriver/issues/detail?id=903#c2 para obter um exemplo de código.
Gili
34

Por que não fazer isso

driver.ExecuteScript("window.open('your url','_blank');");
kernowcode
fonte
a maioria dos bloqueadores de pop-up bloqueará essa tentativa
Bert Lamb
1
provavelmente seguro para teste onde você está no controle das configurações do seu navegador
kernowcode
1
provavelmente funcionaria muito bem. chromedriver parece desativar todas as extensões (ou seja, adblock)
Josh O'Bryan
4
O método de envio de chaves não funciona mais para mim após a atualização para o Chrome 49.0.2623.75m, e esse método funciona nessa versão do Chrome.
Steven
6
Se quiser abrir uma página em branco na guia, você podedriver.ExecuteScript("window.open('about:blank','_blank');");
Steven
12

Para abrir uma nova guia usando JavascriptExecutor,

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

Irá controlar na guia de acordo com o índice:

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

Controle do motorista na guia principal:

driver.switchTo().window(tabs.get(0));
Ishita Shah
fonte
Que tal lançar 3 URL's? 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));, Eu tentei isso, mas obtendo exceção de array fora do limite, Se você souber de alguma solução, por favor me avise.
cruisepandey
Funciona de forma semelhante para a 3ª guia também. Posso saber exatamente onde a exceção é lançada (no fechamento do driver)?
Ishita Shah
Não, nesta linha driver.switchTo().window(tabs.get(2));, isso funciona bem, ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");mas não terei nenhum controle para alternar para o Windows.
cruisepandey
9

Para abrir uma nova janela no 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);

Para alternar entre as guias, leia aqui

Junaid Khan
fonte
8

Você pode usar o seguinte código usando Java com Selenium WebDriver:

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

Usando JavaScript:

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

Depois de abrir uma nova guia, é necessário alternar para essa guia:

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Ripon Al Wasim
fonte
A operação manual Ctrl + T para abrir uma nova guia foi implementada aqui
Ripon Al Wasim
@ Chandra Shekhar: Você pode tentar meu código JS acima?
Ripon Al Wasim
@ Shivam: Muito obrigado. É bom ouvir como o código funcionava.
Ripon Al Wasim
5

Experimente isso para o 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
fonte
3

O código abaixo abrirá o link em uma nova janela

String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
Nagaraju Jampani
fonte
1
objeto de tipo 'Chaves' não tem atributo 'chord'
Robino
@Robino. Eu vejo isso na classe Keys (org.openqa.Selenium)
MrBCut
3

Quase todas as respostas aqui estão desatualizadas.

WebDriver agora tem suporte para abrir guias:

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

Irá abrir uma nova guia. Na verdade, abrir uma janela se tornou um caso fora do padrão:

browser.manage.new_window(:window)

A guia ou janela não será focalizada automaticamente. Para mudar para ele:

browser.switch_to.window new_tab
Matthias Winkelmann
fonte
2

Para abrir uma nova guia no navegador Chrome existente usando Selenium WebDriver, você pode 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);
user2000197
fonte
Sim, funciona bem abrir uma nova url na mesma aba da url existente, bom para muitos testes de link porque não usa muitos recursos.
John Peters de
2

Tive problemas para abrir uma nova guia no Chrome por um tempo. Mesmo driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");não funcionou para mim.

Descobri que não basta que o selênio tenha foco no driver, o Windows também tem que ter a janela na frente.

Minha solução foi invocar um alerta no cromo que traria a janela para frente e, em seguida, executaria o comando. Código de amostra:

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

Estou usando o Selenium 2.52.0 em Java e Firefox 44.0.2. Infelizmente, nenhuma das soluções acima funcionou para mim. O problema é que se eu chamar driver.getWindowHandles (), sempre recebo um único identificador. De alguma forma, isso faz sentido para mim, pois o Firefox é um processo único e cada guia não é um processo separado. Mas talvez eu esteja errado. De qualquer forma, tento escrever minha própria solução:

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

Usei a combinação Ctrl + t para abrir uma nova guia, Ctrl + w para fechá-la e, para voltar à guia original, usei Ctrl + 1 (a primeira guia). Sei que a minha solução não é perfeita ou mesmo boa e gostaria também de trocar com switchTo call do driver, mas como escrevi não foi possível porque tinha apenas um identificador. Talvez isso seja útil para alguém na mesma situação.

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

Como abrir uma nova guia usando Selenium WebDriver com Java para cromo?

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

O código acima desabilitará as primeiras extensões e uma nova guia da classe de robô será aberta.

Nikhil Shah
fonte
1

Esta linha de código irá abrir uma nova guia do navegador usando selenium webdriver

((JavascriptExecutor)getDriver()).executeScript("window.open()");
khaleefa shaik
fonte
Quando executei o código acima, no Chrome foi aberta uma nova guia. No entanto, no firefox uma nova janela é aberta. Em ambos os casos, o manipulador de janela é diferente para os recém-abertos. Então eu acho que uma guia é mais ou menos igual a uma janela. Claro, a janela anônima é definitivamente diferente da guia normal de uma janela.
MamathaMacherla de
1

*JAVA

Eu recomendo usar JavascriptExecutor:

  • Abra uma nova janela em branco:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Abra uma nova janela com url específico:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

A seguir importação:

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

Mesmo exemplo 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
fonte
0

Como abrir uma nova, mas mais importante, como você faz as coisas nessa nova guia? O Webdriver não adiciona um novo WindowHandle para cada guia e só tem controle da primeira guia. Assim, após selecionar uma nova guia (Control + Tab Number), defina .DefaultContent () no driver para definir a guia visível como aquela em que você vai trabalhar.

Visual básico

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

Para abrir uma nova guia no navegador Firefox existente usando Selenium WebDriver

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t"); 
Vickisys
fonte
0
 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
Alex Mathew
fonte
No futuro, forneça algum texto explicativo junto com o snippet de código para tornar suas postagens mais fáceis 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
fonte
0

verifique este exemplo completo para entender como abrir várias guias e alternar entre elas e, no final, feche todas as guias

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 exemplo é dado por esta página da web

anuja jain
fonte
0

Devido a um bug em https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 , embora webdriver.switchTo realmente mude de guia, o foco é deixado na primeira guia. Você pode confirmar isso executando driver.get após switchWindow e ver se a segunda guia realmente vai para o novo URL e não para a guia original.

Uma solução temporária foi o que @ yardening2 sugeriu. Use js para abrir um alerta e, em seguida, use o webdriver para aceitá-lo.

anil desejado
fonte
0

Este código está funcionando para mim (selênio 3.8.1, chromedriver = 2.34.522940, cromo = 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
fonte
0

Descrição : Como abrir uma nova aba usando Selenium WebDriver com Java?

Resposta : Após clicar em qualquer link, abra uma nova aba.

Se quisermos lidar com a guia aberta recentemente, precisamos lidar com a guia usando o comando .switchTo (). Window ().

Alterne para a guia específica, execute a operação e volte para a guia 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
fonte
0

Selenium não suporta a abertura de novas abas, ele suporta apenas a abertura de novas janelas. Para todos os efeitos, uma nova janela é funcionalmente equivalente a uma nova guia.

Existem vários hacks para contornar o problema, mas eles vão causar outros problemas a longo prazo.

Ardesco
fonte
0

Se você deseja abrir a nova guia, você pode usar este

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

Se você deseja abrir o link da nova guia, você pode usar este

com JavascriptExecutor:

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

com ações:

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

Manipulando a janela do navegador usando o 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
fonte
Falha ao responder à questão. Sua resposta é sobre como mudar para uma janela já existente, OP perguntou como abrir uma nova.
Thomas Hirsch