it-swarm.com.de

Wie wechselt man zum neuen Browserfenster, das sich nach dem Klicken auf die Schaltfläche öffnet

Ich habe eine Situation, wenn das Klicken auf die Schaltfläche das neue Browserfenster mit den Suchergebnissen öffnet.

Gibt es eine Möglichkeit, eine Verbindung herzustellen und sich auf ein neues geöffnetes Browserfenster zu konzentrieren?  

Arbeiten Sie damit und kehren Sie dann zum ursprünglichen (ersten) Fenster zurück.

Sie können zwischen den Fenstern wie folgt wechseln:

// Store the current window handle
String winHandleBefore = driver.getWindowHandle();

// Perform the click operation that opens new window

// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
}

// Perform the actions on new window

// Close the new window, if that window no more required
driver.close();

// Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);

// Continue with original browser (first window)
93
Surya

Einfach zum Inhalt hinzufügen ...

Rückkehr zum Hauptfenster (Standardfenster).

benutze driver.switchTo().defaultContent();

11
Amarnath Rayudu

Dieses Skript hilft Ihnen beim Umschalten von einem Parent-Fenster zu einem Child-Fenster und zurück zum cntrl-Fenster zum Parent-Fenster

String parentWindow = driver.getWindowHandle();
Set<String> handles =  driver.getWindowHandles();
   for(String windowHandle  : handles)
       {
       if(!windowHandle.equals(parentWindow))
          {
          driver.switchTo().window(windowHandle);
         <!--Perform your operation here for new window-->
         driver.close(); //closing child window
         driver.switchTo().window(parentWindow); //cntrl to parent window
          }
       }
10
Prashanth Sams

Surya, dein Weg wird aus zwei Gründen nicht funktionieren:

  1. sie können den Treiber während der Testauswertung nicht schließen, da es den Fokus verliert , bevor Sie zum aktiven Element wechseln, und Sie NoSuchWindowException erhalten.
  2. wenn test auf ChromeDriver ausgeführt wird, erhalten Sie kein Fenster, sondern einen Tab in Ihrer Anwendung. Da SeleniumDriver nicht mit Registerkarten agieren kann wechselt nur zwischen Fenstern. Es hängt davon ab, wo sich die neue Registerkarte öffnet, und stürzt beim Timeout ab. 
3
Invy

Registry für IE ändern:

 ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
  2. Klicken Sie mit der rechten Maustaste → Neu → String-Wert → Wertname: TabProcGrowth (erstellen, falls nicht vorhanden)
  3. TabProcGrowth (Rechtsklick) → Ändern ... → Wertdaten: 0

Source:Problem mit dem Windows-Wechsel des Selenium WebDriver in Internet Explorer 8-10

In meinem Fall hat IE nach der Registrierungsbearbeitung neue Fenstergriffe erkannt.

Aus dem MSDN Blog genommen:

Tab Process Growth: Legt die Rate fest, mit der IE New Tab-Prozesse erstellt.

Der "Max-Number" -Algorithmus: Dies gibt die maximale Anzahl von Tabulatorprozessen an, die für eine einzelne Isolationssitzung für einen einzelnen Frame-Prozess auf einer bestimmten obligatorischen Integritätsstufe (MIC) ausgeführt werden dürfen. Relative Werte sind:

  • TabProcGrowth = 0: Registerkarten und Frames werden innerhalb desselben Prozesses ausgeführt. Frames werden nicht auf MIC-Ebenen vereinheitlicht.
  • TabProcGrowth = 1: Alle Registerkarten für einen bestimmten Frame-Prozess werden in einem einzigen Tab-Prozess für eine bestimmte MIC-Ebene ausgeführt.

Source:Beim Öffnen eines neuen Tabs wird möglicherweise ein neuer Prozess mit Internet Explorer 8.0 gestartet.


Internet Optionen:

  • Sicherheit → Deaktivieren Sie Geschützten Modus aktivieren für alle Zonen (Internet, Lokales Intranet, Vertrauenswürdige Sites, Eingeschränkte Sites).
  • Erweitert → Sicherheit → Auswahl aufheben {Enhanced Protected Mode aktivieren

Code:

Browser: IE11 x64 (Zoom: 100%)
OS: Windows 7 x64
Selen: 3.5.1
WebDriver: IEDriverServer x64 3.5.1

public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle(); // Save parent window
WebElement clickableElement = driver.findElement(by);
clickableElement.click(); // Open child window
WebDriverWait wait = new WebDriverWait(driver, 10); // Timeout in 10s
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
    Set<String> handles = driver.getWindowHandles();
    // Switch to child window
    for (String handle : handles) {
        driver.switchTo().window(handle);
        if (!parentHandle.equals(handle)) {
            break;
        }
    }
    driver.manage().window().maximize();
}
return parentHandle; // Returns parent window if need to switch back
}



/* How to use method */
String parentHandle = Selenium.openWindow(driver, by);

// Do things in child window
driver.close();

// Return to parent window
driver.switchTo().window(parentHandle);

Der obige Code enthält eine If-Check-Funktion, um sicherzustellen, dass Sie nicht zum übergeordneten Fenster wechseln, da Set<T> keine garantierte Reihenfolge in Java hat. WebDriverWait scheint die Erfolgschance zu erhöhen, wie dies durch die folgende Aussage unterstützt wird.

Zitat aus Luke Inman-Semerau : (Entwickler für Selenium)

Es kann einige Zeit dauern, bis der Browser das neue Fenster bestätigt, und Sie können fallen in Ihre switchTo () - Schleife, bevor das Popup-Fenster angezeigt wird.

Sie gehen automatisch davon aus, dass das letzte Fenster von .__ zurückgegeben wurde. getWindowHandles () wird der zuletzt geöffnete sein. Das ist nicht unbedingt wahr, da sie nicht garantiert in jeder Bestellung zurückgegeben werden.

Source:Kann ein Popup im IE nicht verarbeiten, die Steuerung überträgt sich nicht in das Popup-Fenster


Zusammenhängende Posts:

2
silver

Ich verwende Iterator und eine while-Schleife, um die verschiedenen Fenstergriffe zu speichern und dann hin und her zu wechseln.

//Click your link
driver.findElement(By.xpath("xpath")).click();
//Get all the window handles in a set
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);
//perform actions on new window
driver.close();
driver.switchTo().window(parent);
            }
2
StatusQuo

Du könntest benutzen: 

driver.SwitchTo().Window(WindowName);

Dabei ist WindowName eine Zeichenfolge, die den Namen des Fensters darstellt, in das Sie den Fokus umschalten möchten. Rufen Sie diese Funktion erneut mit dem Namen des ursprünglichen Fensters auf, um wieder darauf zuzugreifen.

1
Breeze91

Das Problem bei vielen dieser Lösungen ist daher, dass Sie davon ausgehen, dass das Fenster sofort angezeigt wird (es passiert nichts sofort und die Dinge passieren im IE wesentlich weniger). Sie gehen auch davon aus, dass es vor dem Klicken auf das Element nur ein Fenster gibt, was nicht immer der Fall ist. Auch IE gibt die Fenstergriffe nicht in einer vorhersagbaren Reihenfolge zurück. Also würde ich folgendes tun.

 public String clickAndSwitchWindow(WebElement elementToClick, Duration 
    timeToWaitForWindowToAppear) {
    Set<String> priorHandles = _driver.getWindowHandles();

    elementToClick.click();
    try {
        new WebDriverWait(_driver,
                timeToWaitForWindowToAppear.getSeconds()).until(
                d -> {
                    Set<String> newHandles = d.getWindowHandles();
                    if (newHandles.size() > priorHandles.size()) {
                        for (String newHandle : newHandles) {
                            if (!priorHandles.contains(newHandle)) {
                                d.switchTo().window(newHandle);
                                return true;
                            }
                        }
                        return false;
                    } else {
                        return false;
                    }

                });
    } catch (Exception e) {
        Logging.log_AndFail("Encountered error while switching to new window after clicking element " + elementToClick.toString()
                + " seeing error: \n" + e.getMessage());
    }

    return _driver.getWindowHandle();
}
 main you can do :

 String mainTab = page.goToNewTab ();
 //do what you want
 page.backToMainPage(mainTab);  

 What you need to have in order to use the main   

        private static Set<String> windows;

            //get all open windows 
            //return current window
            public String initWindows() {
                windows = new HashSet<String>();
                driver.getWindowHandles().stream().forEach(n ->   windows.add(n));
                return driver.getWindowHandle();
            }

            public String getNewWindow() {
                List<String> newWindow = driver.getWindowHandles().stream().filter(n -> windows.contains(n) == false)
                        .collect(Collectors.toList());
                logger.info(newWindow.get(0));
                return newWindow.get(0);
            }


            public String goToNewTab() {
                String startWindow = driver.initWindows();
                driver.findElement(By.cssSelector("XX")).click();
                String newWindow = driver.getNewWindow();
                driver.switchTo().window(newWindow);
                return startWindow;
            }

            public void backToMainPage(String startWindow) {
                driver.close();
                driver.switchTo().window(startWindow);
            }
0
Ran Adler