Jak otworzyć nową kartę za pomocą Selenium WebDriver?


114

Jak otworzyć nową kartę w istniejącej przeglądarce Firefox za pomocą Selenium WebDriver (aka Selenium 2)?


Jakiego języka programowania używasz?
alecxe

2
Używam java. Mam jedno rozwiązanie "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" i działa całkowicie dobrze.
Bhakti Shah,

Czy możesz wtedy kontrolować nową kartę? Selenium nie obsługuje nowych kart (zamiast tego próbuje otwierać nowe okna). Zobacz moje odpowiedzi stackoverflow.com/questions/14550360/ ... i stackoverflow.com/questions/17225911/… . Co dokładnie próbujesz osiągnąć?
Petr Janeček

Chciałem skopiować jakiś tekst, a następnie otworzyć nową kartę i wkleić ten sam tekst w nowej karcie. Nie próbowałem kontrolować nowej karty, ale działa dobrze w przypadku tego, co chcę osiągnąć.
Bhakti Shah,

Zrobiłem to samo, używając GetText () tego elementu, a następnie zrobiłem Driver.get (tekst).
Bhakti Shah,

Odpowiedzi:


53

Poniższy kod otworzy łącze w nowej karcie.

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

Poniższy kod otworzy pustą nową kartę.

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

7
użyj Keys.COMMAND zamiast Keys.CONTROL, jeśli używasz
Maca

2
To rozwiązanie wydaje się mniej niż optymalne, ponieważ zależy od skrótów specyficznych dla systemu operacyjnego (i być może przeglądarki) ... Przynajmniej, jeśli używasz czegoś takiego jak JS window.open(), możesz oczekiwać, że będzie działać na wielu platformach / przeglądarkach.
mkasberg

86

Tylko dla każdego, kto szuka odpowiedzi w powiązaniach Ruby / Python / C # (Selenium 2.33.0).

Zwróć uwagę, że faktyczne klucze do wysłania zależą od systemu operacyjnego, na przykład Mac używa COMMAND + tzamiastCONTROL + t .

Rubin

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

Pyton

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

DO#

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
jak wrócić do poprzedniej karty?
lurscher

11
WebDriver może obsługiwać więcej niż jedną kartę - po prostu traktuje je jako osobne okna. Musisz więc tylko driver.switchTo().window(windowName);uzyskać dostęp do dowolnej karty lub okna. Oczywiście musiałbyś normalnie śledzić nazwy okien, aby umożliwić przełączanie się między nimi.
Mark Rowlands,

1
Czy możesz wyjaśnić, dlaczego pobierasz element i wysyłasz Ctrl-t do tego elementu? To nie ma żadnego sensu… nie możesz użyć „Ctrl + t na elemencie sieci”? Dlaczego nie uruchomić po prostu nowych akcji (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Czy ktoś mógłby wyjaśnić?
Brondahl

1
To nie działa na mnie. Wypróbowałem kilka różnych sposobów naciskania ctrl + t, z których żaden nie pozwala na otwarcie nowej karty.
Thayne

4
@Thayne błąd ChromeDrivera uniemożliwia działanie CTRL + T. Możesz użyć CTRL + LPM jako obejścia. Przykładowy kod znajdziesz na code.google.com/p/chromedriver/issues/detail?id=903#c2 .
Gili

34

Dlaczego tego nie zrobisz

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

większość programów do blokowania wyskakujących okienek zablokuje tę próbę
Bert Lamb

1
prawdopodobnie bezpieczne do testowania tam, gdzie masz kontrolę nad ustawieniami przeglądarki
kernowcode

1
prawdopodobnie działałby świetnie. chromedriver wydaje się wyłączać wszystkie rozszerzenia (tj. adblock)
Josh O'Bryan

4
Metoda wysyłania kluczy przestała działać po aktualizacji do Chrome 49.0.2623.75m i ta metoda działa w tej wersji Chrome.
Steven

6
Jeśli chcesz otworzyć pustą stronę w zakładce, możeszdriver.ExecuteScript("window.open('about:blank','_blank');");
Steven

12

Aby otworzyć nową kartę za pomocą JavascriptExecutor,

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

Będzie kontrolować na karcie zgodnie z indeksem:

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

Kontrola kierowcy na karcie głównej:

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

Co powiesz na uruchomienie 3 adresów 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));, Próbowałem tego, ale otrzymuję tablicę poza granicami wyjątku. Jeśli znasz jakieś rozwiązanie, daj mi znać.
cruisepandey

Działa podobnie również dla trzeciej zakładki. Czy mogę wiedzieć, gdzie dokładnie zgłasza wyjątek (przy zamknięciu sterownika)?
Ishita Shah

Nie, w tej linii driver.switchTo().window(tabs.get(2));to działa dobrze, ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");ale nie będę miał żadnej kontroli, aby przełączyć się na Windows.
cruisepandey


8

Możesz użyć następującego kodu używając Java z Selenium WebDriver:

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

Używając JavaScript:

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

Po otwarciu nowej karty musi przejść do tej karty:

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

Ręczna operacja Ctrl + T w celu otwarcia nowej karty została zaimplementowana tutaj
Ripon Al Wasim

@ Chandra Shekhar: Czy możesz wypróbować mój kod JS powyżej?
Ripon Al Wasim

@ Shivam: Dziękuję bardzo. Dobrze jest usłyszeć, że kod zadziałał.
Ripon Al Wasim

5

Wypróbuj to w przeglądarce 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

Poniższy kod otworzy link w nowym oknie

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

1
obiekt typu „Keys” nie ma atrybutu „akord”
Robino

@Robino. Widzę to na zajęciach Keys (org.openqa.Selenium)
MrBCut

3

Prawie wszystkie odpowiedzi tutaj są nieaktualne.

WebDriver obsługuje teraz otwieranie kart:

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

Otworzy się nowa karta. Otwarcie okna stało się właściwie przypadkiem niestandardowym:

browser.manage.new_window(:window)

Karta lub okno nie zostaną automatycznie zogniskowane. Aby się na to przełączyć:

browser.switch_to.window new_tab

2

Aby otworzyć nową kartę w istniejącej przeglądarce Chrome za pomocą Selenium WebDriver, możesz użyć tego kodu:

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

Tak, to działa dobrze, otwórz nowy adres URL w tej samej zakładce istniejącego adresu URL, dobre dla wielu testów linków, ponieważ nie zużywa wielu zasobów.
John Peters

2

Przez jakiś czas miałem problem z otwarciem nowej karty w chrome. Nawet driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");nie działał dla mnie.

Okazało się, że nie wystarczy, że selen skupia się na sterowniku, Windows też musi mieć szybę z przodu.

Moim rozwiązaniem było wywołanie alertu w chrome, który wyprowadziłby okno na wierzch, a następnie wykonał polecenie. przykładowy kod:

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

1

Używam Selenium 2.52.0 w Javie i Firefox 44.0.2. Niestety żadne z powyższych rozwiązań nie zadziałało. Problem polega na tym, że jeśli wywołuję driver.getWindowHandles (), zawsze otrzymuję 1 pojedynczy uchwyt. W jakiś sposób ma to dla mnie sens, ponieważ Firefox to pojedynczy proces, a każda karta nie jest oddzielnym procesem. Ale może się mylę. W każdym razie próbuję napisać własne rozwiązanie:

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

Użyłem kombinacji Ctrl + t, aby otworzyć nową kartę, Ctrl + w, aby ją zamknąć, a aby wrócić do oryginalnej karty, użyłem Ctrl + 1 (pierwsza karta). Zdaję sobie sprawę, że moje rozwiązanie nie jest idealne ani nawet dobre i chciałbym też przełączyć się ze sterownika switchTo call, ale jak pisałem nie było to możliwe, bo miałem tylko jedną rączkę. Może będzie to pomocne dla kogoś w takiej samej sytuacji.


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

1

Jak otworzyć nową kartę za pomocą Selenium WebDriver z Javą dla 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);

Powyższy kod wyłączy pierwsze rozszerzenia i po użyciu klasy robota otworzy się nowa zakładka.


1

Ta linia kodu otworzy nową kartę przeglądarki przy użyciu selenium webdriver

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

Kiedy uruchomiłem powyższy kod, w chrome otworzyła się nowa karta. Jednak w przeglądarce Firefox otwiera się nowe okno. W obu przypadkach obsługa okien jest inna dla nowo otwieranych. Więc myślę, że zakładka jest mniej więcej tym samym, co okno. Oczywiście okno incognito zdecydowanie różni się od zwykłej karty okna.
MamathaMacherla

1

*JAWA

Polecam użycie JavascriptExecutor:

  • Otwórz nowe puste okno:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Otwórz nowe okno z określonym adresem URL:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Następujący import:

import org.openqa.selenium.JavascriptExecutor;

0

Ten sam przykład dla 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

Jak otworzyć nową, ale co ważniejsze, jak robisz rzeczy w tej nowej karcie? Webdriver nie dodaje nowego WindowHandle dla każdej karty i kontroluje tylko pierwszą kartę. Tak więc po wybraniu nowej zakładki (Control + Tab Number) ustaw .DefaultContent () na sterowniku, aby zdefiniować widoczną kartę jako tę, nad którą będziesz pracować.

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

Aby otworzyć nową kartę w istniejącej przeglądarce Firefox przy użyciu 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();

W przyszłości podaj tekst objaśnienia wraz z fragmentem kodu, aby ułatwić zrozumienie postów.
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

sprawdź ten pełny przykład, aby zrozumieć, jak otwierać wiele kart i przełączać się między nimi, a na koniec zamknąć wszystkie karty

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

Ten przykład jest podany na tej stronie internetowej


0

Z powodu błędu w https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 mimo że webdriver.switch W rzeczywistości przełącza karty, fokus jest pozostawiony na pierwszej karcie. Możesz to potwierdzić, wykonując plik driver.get za przełącznikiemWindow i zobaczyć, że druga karta faktycznie przechodzi do nowego adresu URL, a nie do oryginalnej karty.

Na razie obejrzyj to, co sugeruje @ yardening2. Użyj js, aby otworzyć alert, a następnie użyj webdriver, aby go zaakceptować.


0

Ten kod działa u mnie (selen 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

Pytanie : Jak otworzyć nową kartę za pomocą Selenium WebDriver z Javą?

Odpowiedź : Po kliknięciu dowolnego linku otwórz nową kartę.

Jeśli chcemy obsłużyć nowo otwartą kartę, musimy obsłużyć kartę za pomocą polecenia .switchTo (). Window ().

Przełącz się na wybraną kartę, a następnie wykonaj operację i wróć do karty nadrzędnej.

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

Selenium nie obsługuje otwierania nowych kart, obsługuje tylko otwieranie nowych okien. W każdym razie nowe okno jest funkcjonalnie równoważne nowej karcie.

Istnieje wiele sposobów na obejście tego problemu, ale na dłuższą metę spowodują one inne problemy.


0

Jeśli chcesz otworzyć nową kartę, możesz tego użyć

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

Jeśli chcesz otworzyć link z nowej karty, możesz użyć tego

z JavascriptExecutor:

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

z akcjami:

 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

Obsługa okna przeglądarki za pomocą 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

Nie odpowiada na pytanie. Twoja odpowiedź dotyczy przejścia do już istniejącego okna, OP zapytał, jak otworzyć nowe.
Thomas Hirsch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.