Modificar el registro para IE:
- HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
- Haga clic derecho → Nuevo → Valor de cadena → Nombre del valor: TabProcGrowth (crear si no existe)
- TabProcGrowth (clic derecho) → Modificar ... → Información 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 ventana después de la edición del registro.
Tomado del blog de MSDN:
Crecimiento del proceso de pestaña: establece la velocidad a la que IE crea procesos de pestaña nueva.
El algoritmo "Número máximo": Especifica el número máximo de procesos de tabulación que se pueden ejecutar para una sola sesión de aislamiento para un proceso de una sola trama en un nivel de integridad obligatorio específico (MIC). Los valores relativos son:
- TabProcGrowth = 0: las pestañas y los marcos se ejecutan dentro del mismo proceso; los fotogramas no están unificados en todos los niveles de MIC.
- TabProcGrowth = 1: todas las pestañas de un proceso de marco determinado se ejecutan en un proceso de pestaña única para un nivel MIC determinado.
Fuente: Abrir una pestaña nueva puede iniciar un proceso nuevo 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 → Desmarque Habilitar modo protegido mejorado
Código:
Navegador: IE11 x64 (Zoom: 100%)
SO: Windows 7 x64
Selenium: 3.5.1
WebDriver: IEDriverServer x64 3.5.1
public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle();
WebElement clickableElement = driver.findElement(by);
clickableElement.click();
WebDriverWait wait = new WebDriverWait(driver, 10);
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
Set<String> handles = driver.getWindowHandles();
for (String handle : handles) {
driver.switchTo().window(handle);
if (!parentHandle.equals(handle)) {
break;
}
}
driver.manage().window().maximize();
}
return parentHandle;
}
String parentHandle = Selenium.openWindow(driver, by);
driver.close();
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)
Es posible que el navegador tarde un poco en reconocer la nueva ventana y es posible que usted esté cayendo en el bucle 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 ningún orden.
Fuente: No se puede manejar una ventana emergente en IE, el control no se transfiere a la ventana emergente
Artículos Relacionados: