Modifica registro per IE:
- HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
- Fare clic con il pulsante destro del mouse → Nuovo → Valore stringa → Nome valore: TabProcGrowth (crea se non esiste)
- TabProcGrowth (clic destro) → Modifica ... → Dati valore: 0
Fonte: problema con il cambio di finestre di Selenium WebDriver in Internet Explorer 8-10
Nel mio caso, IE ha iniziato a rilevare nuovi handle di finestra dopo la modifica del registro.
Tratto dal blog MSDN:
Crescita processo scheda: imposta la velocità con cui IE crea processi Nuova scheda.
L'algoritmo "Max-Number": specifica il numero massimo di processi di tabulazione che possono essere eseguiti per una singola sessione di isolamento per un singolo processo frame a uno specifico livello di integrità obbligatoria (MIC). I valori relativi sono:
- TabProcGrowth = 0: schede e frame vengono eseguiti all'interno dello stesso processo; i frame non sono unificati tra i livelli MIC.
- TabProcGrowth = 1: tutte le schede per un determinato processo di frame vengono eseguite in un unico processo di scheda per un dato livello MIC.
Origine: l' apertura di una nuova scheda potrebbe 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
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);
Il codice sopra include un controllo if per assicurarsi di non passare alla finestra principale poiché Set<T>
non ha alcun ordine garantito in Java .WebDriverWait
sembra aumentare le possibilità di successo come sostenuto dalla dichiarazione di seguito.
Citato da Luke Inman-Semerau : (Developer for Selenium)
Il browser potrebbe impiegare del tempo per riconoscere la nuova finestra e potresti cadere nel ciclo switchTo () prima che venga visualizzata la finestra popup.
Si presume automaticamente che l'ultima finestra restituita da getWindowHandles () sarà l'ultima aperta. Non è necessariamente vero, poiché non è garantito che vengano restituiti in qualsiasi ordine.
Origine: impossibile gestire un popup in IE, il controllo non viene trasferito alla finestra popup
Post correlati: