ventanas ventana una que pestaña para otra nueva modal link hacer ejemplo desde conectar como boton abrir abra java selenium selenium-webdriver webdriver new-window

java - una - ¿Cómo cambiar a la nueva ventana del navegador, que se abre después de hacer clic en el botón?



jdialog modal java ejemplo (11)

Tengo una situación, cuando haga clic en el botón se abre la nueva ventana del navegador con los resultados de búsqueda.

¿Hay alguna forma de conectarse y enfocarse en la nueva ventana del navegador abierta?

Y trabaje con eso, luego regrese a la ventana original (primera).


Modificar el registro para IE:

  1. HKEY_CURRENT_USER / Software / Microsoft / Internet Explorer / Principal
  2. Haga clic con el botón derecho → Nuevo → Valor de cadena → Nombre del valor: TabProcGrowth (crear si no existe)
  3. TabProcGrowth (clic con el botón derecho) → Modificar ... → Datos del valor: 0

Fuente: Problema de cambio de ventanas de Selenium WebDriver en Internet Explorer 8-10

En mi caso, IE comenzó a detectar nuevos identificadores de ventanas después de la edición del registro.

Tomado del blog de MSDN:

Crecimiento del proceso de tabulación: Establece la velocidad a la que IE crea los procesos de Nueva pestaña.

El algoritmo de "Número máximo": Esto especifica el número máximo de procesos de pestañas que se pueden ejecutar para una sola sesión de aislamiento para un proceso de marco único en un nivel de integridad obligatorio (MIC) específico. Los valores relativos son:

  • TabProcGrowth = 0: las pestañas y los marcos se ejecutan dentro del mismo proceso; los marcos no están unificados a través de los niveles MIC.
  • TabProcGrowth = 1: todas las pestañas para un proceso de marco determinado se ejecutan en un proceso de una sola pestaña para un nivel MIC determinado.

Fuente: al abrir una pestaña nueva se puede iniciar un nuevo proceso con Internet Explorer 8.0

Opciones de Internet:

  • Seguridad → Desmarque Habilitar modo protegido para todas las zonas (Internet, intranet local, sitios de confianza, sitios restringidos)
  • Avanzado → Seguridad → Desmarcar Habilitar modo protegido mejorado

Código:

Navegador: 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<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 primaria ya que Set<T> no tiene un pedido garantizado en Java . WebDriverWait parece aumentar las posibilidades de éxito según lo confirma la siguiente declaración.

Citado de Luke Inman-Semerau : (Desarrollador de Selenio)

El navegador puede tomar tiempo para reconocer la nueva ventana, y puede estar cayendo en su ciclo switchTo () antes de que aparezca la ventana emergente.

Automáticamente asume que la última ventana devuelta por getWindowHandles () será la última abierta. Eso no es necesariamente cierto, ya que no se garantiza que se devuelvan en cualquier orden.

Fuente: response

Artículos Relacionados:


Entonces, el problema con muchas de estas soluciones es que asumes que la ventana aparece instantáneamente (nada sucede instantáneamente, y las cosas suceden mucho menos al instante en IE). Además, asume que solo habrá una ventana antes de hacer clic en el elemento, que no siempre es el caso. Además, IE no devolverá los identificadores de ventana en un orden predecible. Entonces yo 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(); }


Esta secuencia de comandos le ayuda a cambiar de una ventana principal a una ventana secundaria y viceversa 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 } }


Me gusta el modo de cambio automático de ventanas que podría controlar utilizando los objetos de la página.

Cuando hay varias ventanas abiertas, cualquier método de este objeto de página se ejecutará en una ventana del navegador que tenga el título correspondiente.

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

Consulte aquí los pasos detallados: testautomationguru.com/…


Podrías usar:

driver.SwitchTo().Window(WindowName);

Donde WindowName es una cadena que representa el nombre de la ventana a la que desea cambiar el foco. Llame a esta función nuevamente con el nombre de la ventana original para volver a ella cuando haya terminado.


Puede alternar entre las 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)


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


Solo para agregar al contenido ...

Para volver a la ventana principal (ventana predeterminada).

use driver.switchTo().defaultContent();


Surya, tu camino no funcionará, por dos razones:

  1. no puede cerrar el controlador durante la evaluación de la prueba, ya que perderá el foco , antes de pasar al elemento activo, y obtendrá NoSuchWindowException.
  2. si se ejecuta la prueba en ChromeDriver, no obtendrá una ventana, sino una pestaña al hacer clic en su aplicación. Como SeleniumDriver no puede actuar con pestañas , solo cambia de una ventana a otra, se cuelga al hacer clic donde se abre una nueva pestaña y se bloquea al finalizar el tiempo de espera.

Uso el iterador y un ciclo while para almacenar los distintos identificadores de ventanas y luego cambiar de un lado a 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); }


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