Zmodyfikuj rejestr dla IE:
- HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
- Kliknij prawym przyciskiem myszy → Nowy → Wartość ciągu → Nazwa wartości: TabProcGrowth (utwórz, jeśli nie istnieje)
- TabProcGrowth (prawy przycisk myszy) → Modyfikuj ... → Dane wartości: 0
Źródło: Problem z przełączaniem okien Selenium WebDriver w przeglądarce Internet Explorer 8-10
W moim przypadku IE zaczął wykrywać nowe uchwyty okien po edycji rejestru.
Zaczerpnięte z bloga MSDN:
Wzrost procesów kart: Ustawia szybkość, z jaką IE tworzy procesy nowej karty.
Algorytm „Max-Number”: określa maksymalną liczbę procesów kart, które mogą być wykonane dla pojedynczej sesji izolacji dla procesu pojedynczej ramki na określonym obowiązkowym poziomie integralności (MIC). Względne wartości to:
- TabProcGrowth = 0: karty i ramki działają w ramach tego samego procesu; ramki nie są ujednolicone na poziomach MIC.
- TabProcGrowth = 1: wszystkie karty dla danego procesu ramki są uruchamiane w pojedynczym procesie karty dla danego poziomu MIC.
Źródło: Otwarcie nowej karty może uruchomić nowy proces w przeglądarce Internet Explorer 8.0
Opcje internetowe:
- Bezpieczeństwo → Odznacz opcję Włącz tryb chroniony dla wszystkich stref (Internet, Lokalny intranet, Zaufane witryny, Witryny z ograniczeniami)
- Zaawansowane → Bezpieczeństwo → Odznacz opcję Włącz rozszerzony tryb chroniony
Kod:
Przeglądarka: IE11 x64 (Zoom: 100%)
System operacyjny: 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);
Powyższy kod zawiera sprawdzenie, czy nie przechodzisz do okna nadrzędnego, ponieważ Set<T>
nie ma gwarantowanej kolejności w Javie . WebDriverWait
wydaje się zwiększać szansę na sukces, co potwierdza poniższe stwierdzenie.
Potwierdzenie nowego okna przez przeglądarkę może zająć trochę czasu i możesz wpaść w pętlę switchTo (), zanim pojawi się wyskakujące okienko.
Automatycznie zakładasz, że ostatnie okno zwrócone przez getWindowHandles () będzie ostatnim otwartym oknem. Niekoniecznie jest to prawda, ponieważ nie gwarantuje się ich zwrotu w dowolnej kolejności.
Źródło: nie można obsłużyć wyskakującego okienka w IE, kontrola nie przenosi się do wyskakującego okienka
Powiązane posty: