Come passare alla nuova finestra del browser, che si apre dopo aver fatto clic sul pulsante?

Ho una situazione, quando si fa clic sul pulsante si apre la nuova finestra del browser con i risultati di ricerca.

C’è un modo per connettersi e concentrarsi sulla nuova finestra del browser aperta?

E lavorare con esso, quindi tornare alla finestra originale (prima).

Puoi passare da una finestra all’altra come segue:

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

Solo per aggiungere al contenuto …

Per tornare alla finestra principale (finestra predefinita).

usa driver.switchTo().defaultContent();

Questo script ti aiuta a passare da una finestra padre a una finestra figlio e viceversa, cntrl alla finestra padre

 String parentWindow = driver.getWindowHandle(); Set handles = driver.getWindowHandles(); for(String windowHandle : handles) { if(!windowHandle.equals(parentWindow)) { driver.switchTo().window(windowHandle);  driver.close(); //closing child window driver.switchTo().window(parentWindow); //cntrl to parent window } } 

Surya, la tua strada non funzionerà, per due motivi:

  1. non è ansible chiudere il driver durante la valutazione del test poiché perde il focus , prima di passare all’elemento attivo e otterrai NoSuchWindowException.
  2. se il test viene eseguito su ChromeDriver non ottieni una finestra, ma la scheda fai clic sulla tua applicazione. Siccome SeleniumDriver non può agire con le tabs , solo passa da una finestra all’altra, si blocca al clic in cui viene aperta la nuova scheda e si arresta in modo anomalo al timeout.

Uso l’iteratore e un ciclo while per memorizzare le varie maniglie delle windows e quindi passare avanti e indietro.

 //Click your link driver.findElement(By.xpath("xpath")).click(); //Get all the window handles in a set Set  handles =driver.getWindowHandles(); Iterator 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); } 

Modifica il registro per IE:

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
  2. Fare clic con il tasto destro del mouse su → Nuovo → Valore stringa → Nome valore: TabProcGrowth (creare se non esiste)
  3. TabProcGrowth (tasto destro) → Modifica … → Dati valore: 0

Sorgente: problema di commutazione delle windows di Selenium WebDriver in Internet Explorer 8-10

Per il mio caso, IE ha iniziato a rilevare nuovi handle di finestra dopo la modifica del registro.

Tratto dal blog MSDN:

Tab Process Growth: imposta la velocità con cui IE crea i processi New Tab.

L’algoritmo “Numero massimo”: specifica il numero massimo di processi di tabulazione che possono essere eseguiti per una singola sessione di isolamento per un processo a fotogramma singolo a un livello di integrità obbligatorio obbligatorio (MIC). I valori relativi sono:

  • TabProcGrowth = 0: tabs e frame eseguiti all’interno dello stesso processo; i frame non sono unificati tra i livelli MIC.
  • TabProcGrowth = 1: tutte le tabs per un determinato processo di frame vengono eseguite in un singolo processo di tabulazione per un determinato livello MIC.

Sorgente: l’ apertura di una nuova scheda può avviare un nuovo processo con Internet Explorer 8.0


Opzioni Internet:

  • Sicurezza → Deseleziona Abilita modalità protetta per tutte le zone (Internet, Intranet locale, Siti attendibili, Siti con restrizioni)
  • Avanzate → Sicurezza → Deseleziona Abilita modalità protetta avanzata

Codice:

Browser: IE11 x64 (Zoom: 100%)
Sistema operativo: Windows 7 x64
Selenio: 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 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); 

Il codice sopra riportato include un if-check per assicurarsi che non stiate passando alla finestra genitore poiché Set non ha un ordinamento garantito in Java . WebDriverWait sembra aumentare le possibilità di successo come supportato WebDriverWait sottostante.

Citato da Luke Inman-Semerau : (Developer for Selenium)

Il browser potrebbe richiedere tempo per riconoscere la nuova finestra e potrebbe cadere nel ciclo switchTo () prima che venga visualizzata la finestra popup.

Si assume automaticamente che l’ultima finestra restituita da getWindowHandles () sarà l’ultima aperta. Questo non è necessariamente vero, in quanto non è garantito il reso in qualsiasi ordine.

Fonte: imansible gestire un popup in IE, il controllo non viene trasferito alla finestra popup


Articoli correlati:

  • Il selenium passa alla nuova scheda in IE
  • Come aprire una nuova scheda in IE usando selenium (java) e aprire un URL in quella scheda (non finestra)

Potresti usare:

 driver.SwitchTo().Window(WindowName); 

Dove WindowName è una stringa che rappresenta il nome della finestra a cui si desidera triggersre lo stato attivo. Chiama di nuovo questa funzione con il nome della finestra originale per tornare indietro quando hai finito.

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

Quindi il problema con molte di queste soluzioni è che si presume che la finestra appaia all’istante (non accade nulla all’istante, e le cose accadono in modo molto meno immediato in IE). Inoltre, supponi che ci sarà solo una finestra prima di fare clic sull’elemento, il che non è sempre il caso. Inoltre, IE non restituirà gli handle di finestra in un ordine prevedibile. Quindi farei quanto segue

  public String clickAndSwitchWindow(WebElement elementToClick, Duration timeToWaitForWindowToAppear) { Set priorHandles = _driver.getWindowHandles(); elementToClick.click(); try { new WebDriverWait(_driver, timeToWaitForWindowToAppear.getSeconds()).until( d -> { Set 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(); } 

Se hai più di un browser (usando java 8)

 import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class TestLink { private static Set windows; public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get("file:///C:/Users/radler/Desktop/myLink.html"); setWindows(driver); driver.findElement(By.xpath("//body/a")).click(); // get new window String newWindow = getWindow(driver); driver.switchTo().window(newWindow); // Perform the actions on new window String text = driver.findElement(By.cssSelector(".active")).getText(); System.out.println(text); driver.close(); // Switch back driver.switchTo().window(windows.iterator().next()); driver.findElement(By.xpath("//body/a")).click(); } private static void setWindows(WebDriver driver) { windows = new HashSet(); driver.getWindowHandles().stream().forEach(n -> windows.add(n)); } private static String getWindow(WebDriver driver) { List newWindow = driver.getWindowHandles().stream() .filter(n -> windows.contains(n) == false).collect(Collectors.toList()); System.out.println(newWindow.get(0)); return newWindow.get(0); } } 

Mi piace il modo in cui cambio automatico di windows posso controllare usando gli oggetti della pagina.

Quando ci sono più windows aperte, qualsiasi metodo da questo object di pagina, verrà eseguito su una finestra del browser che ha il titolo corrispondente.

 @Window(".* some windows title goes here .*") public class ToolsQANewWindow { // your page object code } 

Controlla qui per i passaggi dettagliati – http://www.testautomationguru.com/selenium-webdriver-automatic-switching-between-browser-windows-using-guice-method-interceptor/