Mam do czynienia z problemem automatyzacji aplikacji internetowej przy użyciu sterownika sieciowego selenu.W jaki sposób selenowy sterownik sieciowy może dowiedzieć się, kiedy otworzyło się nowe okno, a następnie wznowić jego działanie?
Strona ma przycisk, który po kliknięciu otwiera nowe okno. Kiedy użyć następującego kodu, to rzuca OpenQA.Selenium.NoSuchWindowException: No window found
WebDriver.FindElement(By.Id("id of the button that opens new window")).Click();
//Switch to new window
_WebDriver.SwitchTo().Window("new window name");
//Click on button present on the newly opened window
_WebDriver.FindElement(By.Id("id of button present on newly opened window")).Click();
Aby rozwiązać powyższy problem dodam Thread.Sleep(50000);
między kliknięciem przycisku i SwitchTo
wypowiedzi.
WebDriver.FindElement(By.Id("id of the button that opens new window")).Click();
Thread.Sleep(50000); //wait
//Switch to new window
_WebDriver.SwitchTo().Window("new window name");
//Click on button present on the newly opened window
_WebDriver.FindElement(By.Id("id of button present on newly opened window")).Click();
To rozwiązało problem, ale nie chcę, aby użyć instrukcji Thread.Sleep(50000);
bo jeśli okno zajmuje więcej czasu, aby otworzyć, kod może zawieść i jeśli okno otwiera się szybko to sprawia, że badanie wolno niepotrzebnie.
Czy istnieje sposób sprawdzenia, kiedy okno zostało otwarte, a następnie test może wznowić jego wykonywanie?
Dzięki za odpowiedź. Działa. – Ozone
Może się zdarzyć, że nowa karta zostanie otwarta, ale nie zostanie jeszcze dodana do instancji napędu. Moje rozwiązanie to przed kliknięciem pobierz bieżącą liczbę uchwytów, a następnie wewnątrz pętli sprawdź, czy liczba została zmieniona. Dopiero wtedy przełącz się do nowo otwartej karty, takiej jak to okno 'driver.switchTo(). (Obsługuje [handles.count() - 1]);' gdzie 'handles' są aktualizowane w każdej iteracji. – Edgar