Tengo una situación, al hacer clic en el botón se abre la nueva ventana del navegador con los resultados de la búsqueda.
¿Hay alguna forma de conectarse y enfocarse en la nueva ventana del navegador abierta?
Y trabaje con él, luego regrese a la (primera) ventana original.
java
selenium
selenium-webdriver
webdriver
new-window
Volodymyr Prysiazhniuk
fuente
fuente
Respuestas:
Puede cambiar entre ventanas de la siguiente manera:
// 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)
fuente
getWindowHandles()
devuelve un conjunto y un conjunto no garantiza el pedido . El último elemento no siempre es la última ventana. Me sorprende que su comentario reciba muchos votos a favor.getWindowHandles()
. Es un comportamiento conocido (no un error) del método y del Java Set <T> en particular. Por lo tanto,switchTo().window(handles[handles.length-1])
no está garantizado en Java. No se puede afirmar que la solución AC # sea correcta.Solo para agregar al contenido ...
Para volver a la ventana principal (ventana predeterminada).
utilizar
driver.switchTo().defaultContent();
fuente
Este script le ayuda a cambiar de una ventana principal a una ventana secundaria y volver cntrl a la ventana principal
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 } }
fuente
Surya, tu camino no funcionará por dos razones:
fuente
Modificar el registro para IE:
Fuente: Problema de cambio de ventanas de Selenium WebDriver en Internet Explorer 8-10
En mi caso, IE comenzó a detectar nuevos identificadores de ventana después de la edición del registro.
Tomado del blog de MSDN:
Opciones de Internet:
Código:
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);
El código anterior incluye un if-check para asegurarse de que no está cambiando a la ventana principal, ya que
Set<T>
no tiene un orden garantizado en Java .WebDriverWait
parece aumentar las posibilidades de éxito según lo respaldado por la siguiente declaración.Citado de Luke Inman-Semerau : (Desarrollador de Selenium)
Artículos Relacionados:
fuente
Podrías usar:
Donde WindowName es una cadena que representa el nombre de la ventana a la que desea cambiar el enfoque. Vuelva a llamar a esta función con el nombre de la ventana original para volver a ella cuando haya terminado.
fuente
Utilizo un iterador y un bucle while para almacenar los distintos identificadores de ventana y luego alternar entre uno y otro.
//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); }
fuente
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); }
fuente
Entonces, el problema con muchas de estas soluciones es que está asumiendo que la ventana aparece instantáneamente (nada sucede instantáneamente y las cosas suceden significativamente menos instantáneamente en IE). También está asumiendo que solo habrá una ventana antes de hacer clic en el elemento, lo que no siempre es el caso. Además, IE no devolverá los identificadores de ventana en un orden predecible. Entonces haría lo siguiente.
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(); }
fuente
Si tiene más de un navegador (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<String> 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<String>(); driver.getWindowHandles().stream().forEach(n -> windows.add(n)); } private static String getWindow(WebDriver driver) { List<String> newWindow = driver.getWindowHandles().stream() .filter(n -> windows.contains(n) == false).collect(Collectors.toList()); System.out.println(newWindow.get(0)); return newWindow.get(0); } }
fuente