Chcę się upewnić, że element jest obecny, zanim webdriver zacznie coś robić.
Staram się, aby coś takiego działało:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Głównie mam problem z konfiguracją funkcji anynomicznej.
TimeSpan.FromSeconds(5)
. To sprawia, że jest bardziej jasne IMOOdpowiedzi:
Alternatywnie możesz użyć niejawnego czekania:
źródło
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Korzystanie z rozwiązania dostarczonego przez Mike'a Kwana może mieć wpływ na ogólną wydajność testowania, ponieważ niejawne oczekiwanie zostanie wykorzystane we wszystkich wywołaniach FindElement. Wiele razy chcesz, aby FindElement od razu zawiódł, gdy element nie jest obecny (testujesz pod kątem zniekształconej strony, brakujących elementów itp.). Z niejawnym oczekiwaniem operacje te czekałyby na wygaśnięcie limitu czasu przed zgłoszeniem wyjątku. Domyślne niejawne oczekiwanie jest ustawione na 0 sekund.
Napisałem małą metodę rozszerzenia do IWebDriver, która dodaje parametr limitu czasu (w sekundach) do
FindElement()
metody. Jest to dość oczywiste:Nie buforowałem obiektu WebDriverWait, ponieważ jego tworzenie jest bardzo tanie, to rozszerzenie może być używane jednocześnie dla różnych obiektów WebDriver, a optymalizacje wykonuję tylko wtedy, gdy jest to ostatecznie potrzebne.
Użycie jest proste:
źródło
WebDriverWait
pochodzi zOpenQA.Selenium.Support.UI
przestrzeni nazw i jest dostarczany w osobnym pakiecie o nazwieSelenium WebDriver Support Classes
NuGetSelenium WebDriver Support Classes
pojawia się teraz na NuGet jako „Selenium.Support” , aktualna wersja to 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
i teraz działa świetnie. Heads up, na wypadek, gdyby ktokolwiek dostał losowe elementy, których nadal nie znaleziono.Możesz także użyć
ExpectedConditions.ElementExists
Będziesz więc szukać takiej dostępności elementu
Źródło
źródło
DotNetSeleniumExtras.WaitHelpers
(o którym mowa powyżej przez @Dejana) „nie jest utrzymywany, problemy nie zostaną rozwiązane, PR nie będą akceptowane”. (źródło: github.com/SeleniumHQ/selenium/issues/… ). Wydawca szuka opiekuna, który go przejmie.Oto odmiana rozwiązania @ Loudenvier, która działa również w celu uzyskania wielu elementów:
źródło
Zainspirowany rozwiązaniem Loudenviera, oto metoda rozszerzenia, która działa dla wszystkich obiektów ISearchContext, nie tylko IWebDriver, która jest specjalizacją tego pierwszego. Ta metoda obsługuje również oczekiwanie na wyświetlenie elementu.
Przykładowe użycie:
źródło
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
to, będzie nadal atutem ustawioną tutaj wartość limitu czasu.Stopwatch
wokół wywołania metodę rozszerzenia iConsole.WriteLine()
wewnątrz przesłanej lambdyUntil()
. Stoper mierzył prawie dokładnie 60 sekund i zapisano tylko jedną wiadomośćConsole
. Czy coś mi umyka?Pomyliłem dowolną funkcję z predykatem. Oto mała metoda pomocnicza:
źródło
Możesz dowiedzieć się czegoś takiego w C #.
Tego właśnie użyłem w JUnit - Selenium
Wykonaj import powiązanych pakietów
źródło
źródło
źródło
Polecenie clickAndWait nie jest konwertowane po wybraniu formatu Webdriver w Selenium IDE. Oto obejście. Dodaj wiersz oczekiwania poniżej. Realistycznie problem polegał na kliknięciu lub zdarzeniu, które miało miejsce przed tym wierszem 1 w moim kodzie C #. Ale tak naprawdę, po prostu upewnij się, że masz WaitForElement przed jakąkolwiek akcją, do której odwołujesz się do obiektu „Według”.
Kod HTML:
Kod C # / NUnit:
źródło
Pyton:
z EC możesz wybrać inne warunki, a także wypróbować: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
źródło
Wypróbuj ten kod:
źródło
Jawne oczekiwanie
Przykład:
źródło
Użyto Rn222 i Aknuds1, aby użyć ISearchContext, który zwraca pojedynczy element lub listę. I można określić minimalną liczbę elementów:
Przykładowe użycie:
źródło
Nie chcesz długo czekać na zmianę elementu. W tym kodzie webdriver czeka do 2 sekund, zanim będzie kontynuowany.
źródło
Ponieważ rozdzielam definicje elementów strony i scenariusze testowania strony, używając już znalezionego IWebElement dla widoczności, można to zrobić w następujący sposób:
źródło
Jest to funkcja wielokrotnego użytku do oczekiwania na element obecny w DOM przy użyciu Explicit Wait.
źródło
Możemy to osiągnąć w następujący sposób:
źródło
WebDriverWait
nie zadziała.Spowodowałoby to natychmiastowy wyjątek, gdy strona jest „interaktywna”. Nie wiem dlaczego, ale limit czasu działa tak, jakby nie istniał.
Być może
SeleniumExtras.WaitHelpers
działa, ale nie próbowałem. Jest to oficjalne, ale zostało podzielone na inny pakiet nuget. Możesz odwołać się do C # Selenium „Oczekiwane warunki są przestarzałe” .Ja używam
FindElements
i sprawdzam, czyCount == 0
, jeśli to prawda, używamawait Task.Delay
. To naprawdę nie jest całkiem wydajne.źródło
Możesz użyć następujących
źródło
Widzę już wiele opublikowanych rozwiązań, które działają świetnie! Jednak na wypadek, gdyby ktoś potrzebował czegoś innego, pomyślałem, że opublikuję dwa rozwiązania, których osobiście użyłem w selenie C #, aby sprawdzić, czy element jest obecny! Mam nadzieję, że to pomaga, na zdrowie!
Oto drugi
źródło
źródło
Pierwsza odpowiedź jest dobra, moim problemem było to, że nieobsługiwane wyjątki nie zamykały poprawnie sterownika sieciowego i zachowywały tę samą pierwszą wartość, której użyłem, czyli 1 sekundę.
Jeśli wystąpi ten sam problem
restart you visual studio
i upewnij się, żeall the exceptions are handled
odpowiednio.źródło
Szukałem, jak czekać w Selenium na stan, wylądowałem w tym wątku i oto, czego teraz używam:
ReadCell(row, col) != ""
może być dowolny warunek. Polub ten sposób, ponieważ:źródło