Jak sprawić, by Selenium 2.0 czekał na załadowanie strony?
java
selenium
webdriver
selenium-webdriver
Karthick Kumar
źródło
źródło
Odpowiedzi:
Możesz także sprawdzić załadowany pagel za pomocą następującego kodu
źródło
Użyj klasy WebDriverWait
Zobacz także tutaj
Możesz spodziewać się pokazać jakiś element. coś jak w C #:
źródło
Jeśli ustawisz ukryte oczekiwanie sterownika, a następnie wywołasz
findElement
metodę na elemencie, który ma znajdować się na ładowanej stronie, WebDriver będzie sondował ten element, aż znajdzie element lub osiągnie wartość limitu czasu.źródło: niejawne-czeka
źródło
Ogólnie rzecz biorąc, w Selenium 2.0 sterownik sieci powinien zwracać kontrolę nad kodem wywołującym dopiero po stwierdzeniu, że strona została załadowana. Jeśli tak się nie stanie, możesz zadzwonić
waitforelemement
, który cyklicznie dzwonifindelement
do momentu znalezienia lub przekroczenia limitu czasu (można ustawić limit czasu).źródło
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
, czekając, aż „document.readyState” będzie „kompletny”. Ze względu na podróż w obie strony z selenu do przeglądarki, wydaje mi się, że warunki wyścigu są złagodzone, a to „zawsze” działa dla mnie. Po „click ()”, kiedy oczekuję załadowania strony, jawnie czekam (za pomocą WebDriverWait) na readystate. ]Implementacja Ruby:
źródło
Możesz usunąć
System.out
linię. Jest dodawany do celów debugowania.źródło
Wszystkie te rozwiązania są odpowiednie w określonych przypadkach, ale występują w nich co najmniej jeden z kilku możliwych problemów:
Nie są wystarczająco ogólne - chcą, abyś wiedział z wyprzedzeniem, że jakiś konkretny warunek będzie spełniony na stronie, na której będziesz (np. Wyświetli się jakiś element)
Są otwarci na warunki wyścigu, w których używasz elementu, który jest faktycznie obecny na starej stronie, a także na nowej stronie.
Oto moja próba ogólnego rozwiązania, które pozwala uniknąć tego problemu (w Pythonie):
Po pierwsze, ogólna funkcja „czekaj” (użyj WebDriverWait, jeśli chcesz, uważam je za brzydkie):
Następnie rozwiązanie polega na tym, że selen rejestruje (wewnętrzny) numer identyfikacyjny dla wszystkich elementów na stronie, w tym najwyższego poziomu
<html>
. Gdy strona się odświeża lub ładuje, otrzymuje nowy element HTML z nowym identyfikatorem.Zakładając, że chcesz kliknąć link z tekstem „mój link”, na przykład:
Aby uzyskać więcej Pythonicznego, wielokrotnego użytku, ogólnego pomocnika, możesz utworzyć menedżera kontekstu:
A potem możesz go używać do praktycznie każdej interakcji selenu:
Myślę, że to kuloodporne! Co myślisz?
Więcej informacji w poście na ten temat tutaj
źródło
Możesz także użyć klasy:
ExpectedConditions
aby jawnie poczekać, aż element pojawi się na stronie, zanim będziesz mógł podjąć jakiekolwiek działania dalsze działaniaMożesz użyć tej
ExpectedConditions
klasy do ustalenia, czy element jest widoczny:Zobacz
ExpectedConditions class Javadoc
listę wszystkich warunków, które możesz sprawdzić.źródło
Odpowiedź Imrana zmieniona dla Java 7:
źródło
To wydaje się być poważnym ograniczeniem WebDriver. Oczywiście oczekiwanie na element nie będzie oznaczało załadowania strony, w szczególności DOM może zostać w pełni zbudowany (stan już gotowy), w którym JS nadal działa, a CSS i obrazy są ładowane.
Uważam, że najprostszym rozwiązaniem jest ustawienie zmiennej JS na zdarzenie onload po zainicjowaniu wszystkiego i sprawdzenie i oczekiwanie na tę zmienną JS w Selenium.
źródło
Jeśli chcesz poczekać na załadowanie określonego elementu, możesz użyć
isDisplayed()
metody naRenderedWebElement
:(Przykład z 5-minutowego przewodnika wprowadzającego )
źródło
RenderedWebElement
interfejs API nie ma . JednakisDisplayed()
metoda jest teraz dostępna bezpośrednio naWebElement
.Jawnie czekaj lub warunkowo czekaj w tym oczekiwaniu, aż dany warunek zostanie spełniony.
Będzie to czekać na każdy element sieciowy przez 60 sekund.
Użyj niejawnie czekaj na czekanie każdego elementu na stronie do tego czasu.
Będzie to czekać na każdy element sieciowy przez 60 sekund.
źródło
Użyj niejawnie czekaj na czekanie każdego elementu na stronie do podanego czasu.
to czeka na każdy element na stronie przez 30 sekund.
Kolejne oczekiwanie to Jawne oczekiwanie lub warunkowe oczekiwanie w tym oczekiwaniu na spełnienie określonego warunku.
W id podaj identyfikator elementu statycznego, który jest wyświetlany w sposób widoczny na stronie, zaraz po załadowaniu strony.
źródło
Dziwi mnie, że predykaty nie były pierwszym wyborem, ponieważ zazwyczaj wiesz, z którymi elementami wejdziesz w interakcję na stronie, którą chcesz załadować. Moje podejście zawsze polegało na tworzeniu predykatów / funkcji takich jak
waitForElementByID(String id)
iwaitForElemetVisibleByClass(String className)
, itd., A następnie wykorzystywania i ponownego wykorzystywania ich tam, gdzie ich potrzebuję, czy to do ładowania strony czy zmiany treści strony, na którą czekam.Na przykład,
W mojej klasie testowej:
W mojej klasie testowej rodzic:
Chociaż wydaje się, że to dużo, zajmuje się to sprawdzaniem wielokrotnie, a przedział czasu, w jakim można to sprawdzić, można ustawić wraz z ostatecznym czasem oczekiwania przed przekroczeniem limitu czasu. Ponadto użyjesz takich metod.
W tym przykładzie klasa nadrzędna zdefiniowała i zainicjowała
WebDriver driver
orazWebDriverWait driverWait
.Mam nadzieję, że to pomoże.
źródło
Najlepszym sposobem oczekiwania na załadowanie strony podczas korzystania z powiązań Java dla WebDriver jest użycie wzorca projektu Obiekt strony z PageFactory. Pozwala to na użycie tego,
AjaxElementLocatorFactory
co to po prostu działa, jako globalne oczekiwanie na wszystkie twoje elementy. Ma ograniczenia dotyczące takich elementów, jak drop-boxy lub złożone przejścia javascript, ale drastycznie zmniejszy ilość potrzebnego kodu i przyspieszy czas testowania. Dobry przykład można znaleźć w tym blogu. Zakłada się podstawową wiedzę na temat Core Java.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
źródło
Rozwiązanie NodeJS:
W Nodejs możesz to zdobyć poprzez obietnice ...
Jeśli napiszesz ten kod, możesz być pewien, że strona jest w pełni załadowana, kiedy dojdziesz do ...
Jeśli napiszesz ten kod, będziesz nawigować, a selen zaczeka 3 sekundy ...
Z dokumentacji Selenium:
this.get (url) → Nie można
Zaplanuje polecenie przejścia do podanego adresu URL.
Zwraca obietnicę, która zostanie rozwiązana po zakończeniu ładowania dokumentu .
Dokumentacja selenu (Nodejs)
źródło
Oto wersja Java 8 najpopularniejszej obecnie odpowiedzi :
Gdzie
myDriver
jestWebDriver
obiekt (zadeklarowany wcześniej).Uwaga : należy pamiętać, że ta metoda (
document.readyState
) sprawdza tylko DOM.źródło
Wywołaj poniżej Funkcja w skrypcie, to poczeka, aż strona nie zostanie załadowana za pomocą javascript
źródło
Możesz zmienić dokument na element, w przypadku gdy zmieniana jest tylko część dokumentu.
Technika ta została zainspirowana odpowiedzią firmy Sincebasic.
źródło
SeleniumWaiter :
I do ciebie użyj :
źródło
Możesz użyć poniższej istniejącej metody, aby ustawić czas dla pageeLoadTimeout w poniższym przykładzie, jeśli ładowanie strony trwa dłużej niż 20 sekund, spowoduje to wyjątek przeładowania strony
źródło
Możesz jawnie poczekać, aż element pojawi się na stronie, zanim podejmiesz jakąkolwiek akcję (np. Element.click ())
Tego użyłem w podobnym scenariuszu i działa dobrze.
źródło
Mój prosty sposób:
źródło
Najlepszy sposób, jaki widziałem, to wykorzystać
stalenessOf
ExpectedCondition, aby poczekać, aż stara strona się zepsuje.Przykład:
Poczeka dziesięć sekund, aż stary znacznik HTML przestanie być aktualny, a następnie wyrzuci wyjątek, jeśli tak się nie stanie.
źródło
Używam węzła + selenium-webdriver (która wersja to teraz 3.5.0). robię to:
źródło
Możesz użyć czekania. w zasadzie są dwa rodzaje oczekiwania w selenie
- Niejawne czekanie
Jest to bardzo proste, zobacz składnię poniżej:
- Jawne czekanie
Jawnie poczekaj lub warunkowo poczekaj, aż wystąpi podany warunek.
Można stosować inne właściwości, takie jak
visblityOf()
,visblityOfElement()
źródło
Jeśli ktoś używa selenidu:
Więcej warunków można znaleźć tutaj: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
źródło
W moim przypadku wykorzystałem następujące informacje, aby poznać stan ładowania strony. W naszej aplikacji są ładowane pliki gif i słucham ich w następujący sposób, aby wyeliminować niechciany czas oczekiwania w skrypcie.
Gdzie xpath lokalizuje gif w DOM HTML. Następnie możesz również wdrożyć metody działania Kliknij.
źródło
Człowieku, wszystkie te odpowiedzi wymagają zbyt dużo kodu. To powinno być proste, ponieważ jest dość powszechne.
Dlaczego po prostu nie wstrzyknąć prostego javascript z webdriver i sprawdzić. Jest to metoda, której używam w mojej klasie webscraper. JavaScript jest dość prosty, nawet jeśli nie znasz js.
źródło
Jak sprawić, by Selenium czekał na ładowanie strony po kliknięciu, oferuje następujące interesujące podejście:
WebElement
ze starej strony.WebElement
momentuStaleElementReferenceException
wyrzucenia.Przykładowy kod:
źródło
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.