Mam kod, który może Ci się spodobać. Najszybszym rozwiązaniem jest użycie narzędzia Popup Finder, ale stworzyłem również własną metodę. Nigdy bym nie polegał na kolejności, w jakiej znajdują się uchwyty okienne, aby wybrać odpowiednie okno. Wyskakujące okienko Finder:
PopupWindowFinder finder = new PopupWindowFinder(driver);
driver.SwitchTo().Window(newWin);
Moja metoda niestandardowa. Zasadniczo podajesz element, który chcesz kliknąć, twój webdriver i opcjonalnie czas oczekiwania przed wyszukiwaniem po kliknięciu elementu.
Bierze wszystkie aktualne dźwignie i tworzy listę. Korzysta z tej listy, aby wyeliminować przypadkowo przełączane wcześniej okna. Następnie klika element, który uruchamia nowe okno.Po kliknięciu zawsze powinno być jakieś opóźnienie, ponieważ nic nie dzieje się natychmiast. Następnie tworzy nową listę i porównuje ją ze starym, dopóki nie znajdzie nowego okna lub pętla wygasa. Jeśli nie uda się znaleźć nowego okna, zwraca wartość null, więc jeśli masz wadliwy webelement, który nie zawsze działa, możesz wykonać zerową kontrolę, aby sprawdzić, czy przełącznik działa.
public static string ClickAndSwitchWindow(IWebElement elementToBeClicked,
IWebDriver driver, int timer = 2000)
{
System.Collections.Generic.List<string> previousHandles = new
System.Collections.Generic.List<string>();
System.Collections.Generic.List<string> currentHandles = new
System.Collections.Generic.List<string>();
previousHandles.AddRange(driver.WindowHandles);
elementToBeClicked.Click();
Thread.Sleep(timer);
for (int i = 0; i < 20; i++)
{
currentHandles.Clear();
currentHandles.AddRange(driver.WindowHandles);
foreach (string s in previousHandles)
{
currentHandles.RemoveAll(p => p == s);
}
if (currentHandles.Count == 1)
{
driver.SwitchTo().Window(currentHandles[0]);
Thread.Sleep(100);
return currentHandles[0];
}
else
{
Thread.Sleep(500);
}
}
return null;
}
Proszę wyjaśnić aktualne. Czy masz na myśli okno nadrzędne? Czy jest jeszcze inny pop-up? – Saifur
Nie wiem, sprawdź zrzut ekranu, postawiłem – Coderz