wake-up-neo.com

Wechseln Sie die Registerkarten mit Selenium WebDriver mit Java

Verwenden von Selenium WebDriver mit Java ... Ich versuche, eine Funktionalität zu automatisieren, bei der ich einen neuen Tab öffnen muss, um einige Vorgänge auszuführen und zum vorherigen Tab (Parent) zurückzukehren. Ich habe den Schaltergriff verwendet, aber er funktioniert nicht. .__ Und eines der seltsamen Dinge, die beide Registerkarten haben den gleichen Fenstergriff, aufgrund dessen ich nicht zwischen den Registerkarten wechseln kann.

Wenn ich jedoch mit verschiedenen Firefox-Fenstern versuche, funktioniert es, aber für den Tab funktioniert es nicht.

Bitte helfen Sie mir, wie kann ich die Tabs wechseln?.

(Ich habe beobachtet, dass beim Öffnen verschiedener Registerkarten in demselben Fenster der Fenstergriff gleich bleibt.)

51
Umesh Kumar
    psdbComponent.clickDocumentLink();
    ArrayList<String> tabs2 = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs2.get(1));
    driver.close();
    driver.switchTo().window(tabs2.get(0));

Dieser Code hat perfekt für mich funktioniert. Versuch es. Sie müssen Ihren Treiber immer auf die neue Registerkarte umstellen, bevor Sie etwas auf der neuen Registerkarte tun möchten.

79

Dies ist eine einfache Lösung, um eine neue Registerkarte zu öffnen, den Fokus darauf zu ändern, die Registerkarte zu schließen und zur alten/ursprünglichen Registerkarte zurückzukehren:

@Test
public void testTabs() {
    driver.get("https://business.Twitter.com/start-advertising");
    assertStartAdvertising();

    // considering that there is only one tab opened in that point.
    String oldTab = driver.getWindowHandle();
    driver.findElement(By.linkText("Twitter Advertising Blog")).click();
    ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
    newTab.remove(oldTab);
    // change focus to new tab
    driver.switchTo().window(newTab.get(0));
    assertAdvertisingBlog();

    // Do what you want here, you are in the new tab

    driver.close();
    // change focus back to old tab
    driver.switchTo().window(oldTab);
    assertStartAdvertising();

    // Do what you want here, you are in the old tab
}

private void assertStartAdvertising() {
    assertEquals("Start Advertising | Twitter for Business", driver.getTitle());
}

private void assertAdvertisingBlog() {
    assertEquals("Twitter Advertising", driver.getTitle());
}
19
Jordan Silva

Es gibt einen Unterschied, wie der Web-Treiber mit verschiedenen Fenstern und mit verschiedenen Registerkarten umgeht.

Fall 1:
Wenn mehrere Fenster vorhanden sind, kann der folgende Code hilfreich sein:

//Get the current window handle
String windowHandle = driver.getWindowHandle();

//Get the list of window handles
ArrayList tabs = new ArrayList (driver.getWindowHandles());
System.out.println(tabs.size());
//Use the list of window handles to switch between windows
driver.switchTo().window(tabs.get(0));

//Switch back to original window
driver.switchTo().window(mainWindowHandle);


Fall 2:
.__ Falls sich mehrere Registerkarten in demselben Fenster befinden, gibt es nur ein Fensterhandle. Beim Wechseln zwischen Fenstergriffen bleibt das Steuerelement auf derselben Registerkarte.
In diesem Fall ist das Wechseln zwischen Registerkarten mit Strg +\t (Strg + Tab) sinnvoller.

//Open a new tab using Ctrl + t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
//Switch between tabs using Ctrl + \t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");

Detaillierte Mustercodes finden Sie hier:
http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

11
Sourabh

Umgehen

Annahme: Durch Klicken auf etwas auf Ihrer Webseite wird eine neue Registerkarte geöffnet.

Verwenden Sie die folgende Logik, um zur zweiten Registerkarte zu wechseln.

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD2).build().perform();

Auf die gleiche Weise können Sie wieder zur ersten Registerkarte wechseln.

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform();
7
Santoshsarma
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
    WebElement e = driver.findElement(By
            .xpath("html/body/header/div/div[1]/nav/a"));
e.sendKeys(selectLinkOpeninNewTab);//to open the link in a current page in to the browsers new tab

    e.sendKeys(Keys.CONTROL + "\t");//to move focus to next tab in same browser
    try {
        Thread.sleep(8000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    //to wait some time in that tab
    e.sendKeys(Keys.CONTROL + "\t");//to switch the focus to old tab again

Hoffe es hilft dir ..

3
Vishwak

Als erstes müssen Sie eine neue Registerkarte öffnen und den Namen des Handles speichern. Am besten verwenden Sie Javascript und keine Schlüssel (Strg + T), da Schlüssel auf Automatisierungsservern nicht immer verfügbar sind. Beispiel:

public static String openNewTab(String url) {
    executeJavaScript("window.parent = window.open('parent');");
    ArrayList<String> tabs = new ArrayList<String>(bot.driver.getWindowHandles());
    String handleName = tabs.get(1);
    bot.driver.switchTo().window(handleName);
    System.setProperty("current.window.handle", handleName);
    bot.driver.get(url);
    return handleName;
}

Als zweites müssen Sie zwischen den Registerkarten wechseln. Wenn Sie dies nur über die Schalterfenster tun, wird dies nicht immer funktionieren, da die Registerkarte, an der Sie arbeiten, nicht immer im Fokus ist und Selenium von Zeit zu Zeit ausfällt Tasten und Javascript unterstützt das Wechseln zwischen Registerkarten nicht wirklich. Daher habe ich Warnungen verwendet, um zwischen Registerkarten zu wechseln. Es funktionierte wie ein Zauber:

public static void switchTab(int tabNumber, String handleName) {
        driver.switchTo().window(handleName);
        System.setProperty("current.window.handle", handleName);
        if (tabNumber==1)
            executeJavaScript("alert(\"alert\");");
        else
            executeJavaScript("parent.alert(\"alert\");");
        bot.wait(1000);
        driver.switchTo().alert().accept();
    }
2
Ed Ram
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);

Diese Methode hilft beim Wechseln zwischen mehreren Fenstern. Das einschränkende Problem bei dieser Methode ist, dass sie nur so oft verwendet werden kann, bis das erforderliche Fenster erreicht ist. Ich hoffe es hilft.

1

Mit Selenium 2.53.1, das firefox 47.0.1 als WebDriver in Java verwendet: Unabhängig von der Anzahl der geöffneten Registerkarten gibt "driver.getWindowHandles ()" nur ein Handle zurück, sodass zwischen Registerkarten nicht gewechselt werden konnte.

Sobald ich mit Chrome 51.0 angefangen habe, konnte ich alle Griffe bekommen. Der folgende Code zeigt, wie auf mehrere Treiber und mehrere Registerkarten in jedem Treiber zugegriffen wird.

// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());

// REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());

// NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
   driver1.switchTo().window(tabs1.get(ii));
   // LOGIC FOR THAT DRIVER'S CURRENT TAB
}

// PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
   drvier2.switchTo().window(tabs2.get(ii));
   // LOGIC FOR THAT DRIVER'S CURRENT TAB
}

Hoffentlich gibt Ihnen das eine gute Vorstellung davon, wie Sie mehrere Registerkarten in mehreren Browserfenstern bearbeiten können.

1
Charles Woodson

Da der driver.window_handles nicht in Ordnung ist, ist dies eine bessere Lösung.

wechseln Sie zunächst mit der Verknüpfung Control + X zur ersten Registerkarte, um zur Registerkarte "x" zu wechseln.

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "1");
# goes to 1st tab

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "4");
# goes to 4th tab if its exists or goes to last tab.
1
Natesh bhat

öffentliche Klasse TabBrowserDemo {

public static void main(String[] args) throws InterruptedException {
    System.out.println("Main Started");
    System.setProperty("webdriver.gecko.driver", "driver//geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://www.irctc.co.in/eticketing/userSignUp.jsf");
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    driver.findElement(By.xpath("//a[text()='Flights']")).click();
    waitForLoad(driver);
    Set<String> ids = driver.getWindowHandles();
    Iterator<String> iterator = ids.iterator();
    String parentID = iterator.next();
    System.out.println("Parent WIn id " + parentID);
    String childID = iterator.next();
    System.out.println("child win id " + childID);

    driver.switchTo().window(childID);
    List<WebElement> hyperlinks = driver.findElements(By.xpath("//a"));

    System.out.println("Total links in tabbed browser " + hyperlinks.size());

    Thread.sleep(3000);
//  driver.close();
    driver.switchTo().window(parentID);
    List<WebElement> hyperlinksOfParent = driver.findElements(By.xpath("//a"));

    System.out.println("Total links " + hyperlinksOfParent.size());

}

public static void waitForLoad(WebDriver driver) {
    ExpectedCondition<Boolean> pageLoadCondition = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
                }
            };
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(pageLoadCondition);
}
0
Aravind HB

Siehe unten:

WebDriver driver = new FirefoxDriver();

driver.manage().window().maximize();
driver.get("https://www.irctc.co.in/");
String oldTab = driver.getWindowHandle();

//For opening window in New Tab
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("Hotels & Lounge")).sendKeys(selectLinkOpeninNewTab);

// Perform Ctrl + Tab to focus on new Tab window
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, Keys.TAB)).perform();

// Switch driver control to focused tab window
driver.switchTo().window(oldTab);

driver.findElement(By.id("textfield")).sendKeys("bangalore");

Hoffe das ist hilfreich!

0
Prashant

Der Fehler bei der ausgewählten Antwort ist, dass sie unnötig die Reihenfolge in webDriver.getWindowHandles() annimmt. Die getWindowHandles()-Methode gibt eine Set zurück, die keine Reihenfolge garantiert. 

Ich habe den folgenden Code verwendet, um Registerkarten zu ändern, was keine Reihenfolge voraussetzt. 

String currentTabHandle = driver.getWindowHandle();
String newTabHandle = driver.getWindowHandles()
       .stream()
       .filter(handle -> !handle.equals(currentTabHandle ))
       .findFirst()
       .get();
driver.switchTo().window(newTabHandle);

Dies funktioniert für MacOS für Firefox und Chrome:

// opens the default browser tab with the first webpage
driver.get("the url 1");
thread.sleep(2000);

// opens the second tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND + "t");
driver.get("the url 2");
Thread.sleep(2000);

// comes back to the first tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND, Keys.SHIFT, "{");
0
ramy

Ich hatte kürzlich ein Problem, der Link wurde in einem neuen Tab geöffnet, aber Selenium konzentrierte sich immer noch auf den ursprünglichen Tab.

Ich verwende Chromedriver und die einzige Möglichkeit, mich auf eine Registerkarte zu konzentrieren, war die Verwendung von switch_to_window().

Hier ist der Python-Code:

driver.switch_to_window(driver.window_handles[-1])

Der Tipp ist also, den Namen des gewünschten Fenstergriffs herauszufinden. Diese werden als Liste in gespeichert

driver.window_handles
0
Kee

Um übergeordnete Fenstergriffe zu erhalten. 

String parentHandle = driverObj.getWindowHandle();
public String switchTab(String parentHandle){
    String currentHandle ="";
    Set<String> win  = ts.getDriver().getWindowHandles();   

    Iterator<String> it =  win.iterator();
    if(win.size() > 1){
        while(it.hasNext()){
            String handle = it.next();
            if (!handle.equalsIgnoreCase(parentHandle)){
                ts.getDriver().switchTo().window(handle);
                currentHandle = handle;
            }
        }
    }
    else{
        System.out.println("Unable to switch");
    }
    return currentHandle;
}
0
Ankit Gupta

Es ist ein sehr einfacher Vorgang: Nehmen Sie an, Sie haben zwei Registerkarten, so dass Sie zuerst die aktuelle Registerkarte mit client.window(callback) schließen müssen, da der Befehl zum Wechseln zum ersten verfügbaren wechselt. Dann können Sie einfach mit client.switchTab zwischen den Registerkarten wechseln.

0
Ravi Ubana

Ein kurzes Beispiel zum Wechseln zwischen Registerkarten in einem Browser (falls ein Fenster vorhanden ist):

// open the first tab
driver.get("https://www.google.com");
Thread.sleep(2000);

// open the second tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
driver.get("https://www.google.com");
Thread.sleep(2000);

// switch to the previous tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "" + Keys.SHIFT + "" + Keys.TAB);
Thread.sleep(2000);

Ich schreibe Thread.sleep(2000), nur um eine Zeitüberschreitung für das Wechseln zwischen den Registerkarten zu haben.

Sie können STRG + TAB verwenden, um zur nächsten Registerkarte zu wechseln, und STRG + UMSCHALT + TAB, um zur vorherigen Registerkarte zu wechseln.

0
Stas
protected void switchTabsUsingPartOfUrl(String platform) {
    String currentHandle = null;
    try {
        final Set<String> handles = driver.getWindowHandles();
        if (handles.size() > 1) {
            currentHandle = driver.getWindowHandle();
        }
        if (currentHandle != null) {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform) && !currentHandle.equals(handle)) {
                    break;
                }
            }
        } else {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform)) {
                    break;
                }
            }
        }
    } catch (Exception e) {
        System.out.println("Switching tabs failed");
    }
}

Rufen Sie diese Methode auf und übergeben Sie dem Parameter eine Teilzeichenfolge der URL der Registerkarte, zu der Sie wechseln möchten

0
Rahul Rana

Einfache Antwort, die für mich funktioniert hat:

for (String handle1 : driver1.getWindowHandles()) {
        System.out.println(handle1); 
        driver1.switchTo().window(handle1);     
}
0
Omar Lari