Ändern Sie die Registrierung für IE:
- HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
- Klicken Sie mit der rechten Maustaste → Neu → Zeichenfolgenwert → Wertname: TabProcGrowth (erstellen, falls nicht vorhanden)
- TabProcGrowth (Rechtsklick) → Ändern ... → Wertdaten: 0
Quelle: Problem beim Umschalten von Selenium WebDriver-Fenstern in Internet Explorer 8-10
In meinem Fall hat der IE nach der Bearbeitung der Registrierung begonnen, neue Fensterhandles zu erkennen.
Entnommen aus dem MSDN-Blog:
Tab-Prozesswachstum: Legt die Rate fest, mit der der IE neue Tab-Prozesse erstellt.
Der "Max-Number" -Algorithmus: Dies gibt die maximale Anzahl von Registerkartenprozessen an, die für eine einzelne Isolationssitzung für einen einzelnen Frame-Prozess auf einer bestimmten obligatorischen Integritätsstufe (MIC) ausgeführt werden können. Relative Werte sind:
- TabProcGrowth = 0: Registerkarten und Frames werden im selben Prozess ausgeführt. Frames sind nicht über MIC-Ebenen hinweg einheitlich.
- TabProcGrowth = 1: Alle Registerkarten für einen bestimmten Frame-Prozess werden in einem einzelnen Registerkartenprozess für eine bestimmte MIC-Ebene ausgeführt.
Quelle: Durch Öffnen einer neuen Registerkarte wird möglicherweise ein neuer Prozess mit Internet Explorer 8.0 gestartet
Internet Optionen:
- Sicherheit → Deaktivieren Sie " Geschützten Modus aktivieren" für alle Zonen (Internet, lokales Intranet, vertrauenswürdige Sites, eingeschränkte Sites).
- Erweitert → Sicherheit → Deaktivieren Sie den erweiterten geschützten Modus aktivieren
Code:
Browser: IE11 x64 (Zoom: 100%)
Betriebssystem: Windows 7 x64
Selen: 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);
Der obige Code enthält eine If-Prüfung, um sicherzustellen, dass Sie nicht zum übergeordneten Fenster wechseln, da Set<T>
in Java keine garantierte Reihenfolge besteht . WebDriverWait
scheint die Erfolgschance zu erhöhen, wie durch die folgende Aussage gestützt.
Es kann einige Zeit dauern, bis der Browser das neue Fenster bestätigt, und Sie fallen möglicherweise in Ihre switchTo () -Schleife, bevor das Popup-Fenster angezeigt wird.
Sie gehen automatisch davon aus, dass das letzte von getWindowHandles () zurückgegebene Fenster das zuletzt geöffnete ist. Dies ist nicht unbedingt der Fall, da nicht garantiert wird, dass sie in beliebiger Reihenfolge zurückgegeben werden.
Quelle: Ein Popup im IE kann nicht verarbeitet werden. Die Steuerung wird nicht in das Popup-Fenster übertragen
Zusammenhängende Posts: