Jak czekać, aż strona załaduje się z selenem

Jak czekać, aż strona załaduje się z selenem
Podczas gdy automatyzacja internetowa lub skrobanie internetowe za pomocą sterownika internetowego Selenium, możesz napotkać problemy, takie jak element, który chcesz wybrać, nie jest dostępny lub przycisk, który chcesz nacisnąć.

Powodem jest to, że sterownik internetowy selenium musi pobrać stronę internetową i zakończyć renderowanie strony, zanim będziesz mógł na nią zrobić wszystko. W przeszłości WebServer wygenerował treść witryny, a przeglądarka właśnie ją pobrała i renderowała. Obecnie mamy wiele jednostronicowych aplikacji internetowych, które działają nieco inaczej. W jednej stronie aplikacje internetowe (SPA) serwer serwuje tylko kody frontendowe. Po renderowaniu kodu frontendowego w przeglądarce kod frontu używa AJAX do żądania danych API do serwera internetowego. Gdy frontend otrzyma dane API, renderuje je w przeglądarce. Tak więc, mimo że przeglądarka zakończyła pobieranie i renderowanie strony internetowej, strona internetowa nadal nie jest gotowa. Musisz poczekać, aż otrzymają dane API i renderować je. Tak więc rozwiązaniem tego problemu jest czekanie, aż dane będą dostępne, zanim zrobimy cokolwiek z selenem.

W Selenium istnieją 2 rodzaje oczekiwania:
1) Niejawne oczekiwanie
2) Już wyraźne oczekiwanie

1) Niejawne oczekiwanie: To jest najłatwiejsze do wdrożenia. Niejawne oczekiwanie mówi, że sterownik internetowy Selenium poczekał kilka sekund, aby DOM (model Document Object) będzie gotowy (strona internetowa będzie gotowa).

2) Już wyraźne: To jest trochę złożone niż niejawne oczekiwanie. W wyraźnym oczekiwaniu powiedz kierowcy internetowej Selenium, na co czekać. Selen czeka na spełnienie tego konkretnego stanu. Po jego spełnieniu sterownik internetowy Selenium będzie gotowy do przyjęcia innych poleceń. Zwykle wyraźny czas oczekiwania jest zmienny. To zależy od tego, jak szybko warunki są spełnione. W najgorszym scenariuszu wyraźne oczekiwanie będzie oczekiwać tak długo, jak domyślne oczekiwanie.

W tym artykule pokażę ci, jak czekać (niejawne i jawne), aby strona załaduje się z selenem. Więc zacznijmy.

Wymagania wstępne:

Aby wypróbować polecenia i przykłady tego artykułu, musisz mieć,

1) Dystrybucja Linux (najlepiej Ubuntu) zainstalowana na komputerze.
2) Python 3 zainstalowany na komputerze.
3) PIP 3 zainstalowany na komputerze.
4) Python Virtualenv Pakiet zainstalowany na komputerze.
5) Przeglądarki internetowe Mozilla Firefox lub Google Chrome zainstalowane na komputerze.
6) Muszę wiedzieć, jak zainstalować sterownik Gecko Firefox lub Chrome Web Sterownik.

Aby spełnić wymagania 4, 5 i 6, przeczytaj mój artykuł Wprowadzenie do selenu z Python 3 w Linuxhint.com.

Można znaleźć wiele artykułów na inne tematy na Linuxhint.com. Pamiętaj, aby je sprawdzić, jeśli potrzebujesz pomocy.

Konfiguracja katalogu projektu:

Aby wszystko się zorganizowano, stwórz nowy katalog projektowy selen-vait/ następująco:

$ mkdir -pv selen -vait/sterowniki

Przejść do selen-vait/ Katalog projektu w następujący sposób:

$ cd selen-vait/

Utwórz wirtualne środowisko Python w katalogu projektu w następujący sposób:

$ Virtualenv .Venv

Aktywuj środowisko wirtualne w następujący sposób:

$ źródło .venv/bin/aktywuj

Zainstaluj selen za pomocą PIP3 w następujący sposób:

$ PIP3 instaluj selen

Pobierz i zainstaluj cały wymagany sterownik internetowy w kierowcy/ Katalog projektu. Wyjaśniłem proces pobierania i instalowania sterowników internetowych w moim artykule Wprowadzenie do selenu z Python 3. Jeśli potrzebujesz pomocy, wyszukaj Linuxhint.com do tego artykułu.

W tym artykule będę używać przeglądarki internetowej Google Chrome. Więc będę używać chromedriver binarny z kierowcy/ informator.

Praca z niejawnym oczekiwaniem:

Aby eksperymentować z niejawnym oczekiwaniem, stwórz nowy skrypt Python Ex01.py W katalogu projektu i wpisz w poniższych wierszach kodów w tym pliku.

od selenu importu Webdriver
z selenu.Webdriver.wspólny.Klucze importują klucze
opcje = WebDriver.Chromeoptions ()
opcje.bezgłowy = prawda
Browser = WebDriver.Chrome (Exceutable_path = "./sterowniki/chromedriver ", opcje = opcje)
przeglądarka.Impliccile_Wait (10)
przeglądarka.Get ("https: // www.UNIXTIMESTAMP.com/”)
Timestamp = przeglądarka.find_element_by_xpath ("// h3 [@class = 'text-danger'] [1]")
Drukuj („Obecny znacznik czasu: % s” (znacznik czasu.tekst.split (") [0]))
przeglądarka.zamknąć()

Po zakończeniu zapisz Ex01.py Skrypt Pythona.

Linia 1 i 2 importuje wszystkie wymagane elementy selenu.

Linia 4 tworzy obiekt opcji Chrome.

Linia 5 umożliwia tryb bezgłowy dla chromu sterownika internetowego.

Linia 7 tworzy obiekt przeglądarki Chrome za pomocą chromedriver binarny z kierowcy/ informator.

Linia 8 służy do poinformowania Selenu, aby poczekać domyślnie przez 10 sekund za pomocą Impliccile_Wait () Metoda przeglądarki.

Linia 10 ładuje www.UNIXTIMESTAMP.com w przeglądarce.

Wiersz 12 znajduje element czasu za pomocą selektora XPath // h3 [@class = 'text-danger'] [1] i przechowuje to w znak czasu zmienny.

Mam selektor XPath z narzędzia Chrome Developer. Jak widać, znacznik czasu jest w pierwszym H3 element z nazwą klasy Niebezpieczeństwo tekstowe. Jest 2 H3 elementy z klasą Niebezpieczeństwo tekstowe.

Linia 13 drukuje tylko znacznik czasu z wybranego elementu za pomocą selektora XPath i przechowywanego w znak czasu zmienny.

Linia 14 zamyka przeglądarkę.

Po zakończeniu uruchom skrypt Python Ex01.py następująco:

$ Python3 Ex01.py

Jak widać, obecny znacznik czasu jest wyodrębniony z Unixtimestamp.com i wydrukowano na konsoli.

Praca z wyraźnym oczekiwaniem:

Aby eksperymentować z wyraźnym oczekiwaniem, stwórz nowy skrypt Python Ex02.py W katalogu projektu i wpisz w poniższych wierszach kodów w tym pliku.

od selenu importu Webdriver
z selenu.Webdriver.wspólny.Klucze importują klucze
z selenu.Webdriver.wspólny.przez import przez
z selenu.Webdriver.wsparcie.Importuj interfejs użytkownika WebDriverwait
z selenu.Webdriver.Wsparcie Importuj Oczekiwane_ponditions
opcje = WebDriver.Chromeoptions ()
opcje.bezgłowy = prawda
Browser = WebDriver.Chrome (Exceutable_path = "./sterowniki/chromedriver ", opcje = opcje)
przeglądarka.Get ("https: // www.UNIXTIMESTAMP.com/”)
próbować:
Timestamp = WebDriverwait (Browser, 10).dopóki(
Oczekiwane_kondacje.obecność_of_element_located ((przez.Xpath ”
// h3 [@class = 'text-danger'] [1] ")))
)
Drukuj („Obecny znacznik czasu: % s” (znacznik czasu.tekst.split (") [0]))
Wreszcie:
przeglądarka.zamknąć()

Po zakończeniu zapisz Ex02.py Skrypt Pythona.

Linia 1-5 importuje wszystkie wymagane komponenty z biblioteki selenium.

Linia 7 tworzy obiekt opcji Chrome.

Linia 8 umożliwia tryb bezgłowy dla chromu sterownika internetowego.

Wiersz 10 tworzy obiekt przeglądarki Chrome za pomocą chromedriver binarny z kierowcy/ informator.

Linia 12 ładuje www.UNIXTIMESTAMP.com w przeglądarce.

Jawne oczekiwanie jest zaimplementowane w bloku próbnym (od wiersza 14-20)

Linia 15-17 używa tworzenia WebDriverwait () obiekt. Pierwszy argument WebDriverwait () jest obiektem przeglądarki, a drugim argumentem jest maksymalny dozwolony czas (najgorszy scenariusz) dla spełnienia warunku, który w tym przypadku trwa 10 sekund.

w dopóki() blok, Oczekiwane_kondacje.obecność_of_element_located () Metoda jest stosowana, aby upewnić się, że element jest obecny przed próbą wybrania elementu. Tutaj, Przez.Xpath służy do powiedzenia obecność_of_element_located () Metoda, że ​​zastosowaliśmy selektor XPath do wybrania elementu. Selektor XPath to // h3 [@class = 'text-danger'] [1].

Po znalezieniu elementu jest przechowywany w znak czasu zmienny.

Linia 18 drukuje tylko znacznik czasu z wybranego elementu.

Wreszcie linia 19-20 zamyka przeglądarkę.

Po zakończeniu uruchom Ex02.py Skrypt Pythona w następujący sposób:

$ Python3 Ex02.py

Jak widać, obecny znacznik czasu z UNIXTIMESTAMP.com jest wydrukowany na konsoli.

Wybieranie elementów w jawnych oczekiwaniach:

W wcześniejszej sekcji użyłem Przez.Xpath do wyboru elementu za pomocą selektora XPath. Możesz także wybrać elementy za pomocą identyfikatora, nazwy znacznika, nazwy klasy CSS, selektora CSS itp.

Obsługiwane metody wyboru podano poniżej:

Przez.Xpath - Wybiera elementy/elementy za pomocą selektora XPath.

Przez.NAZWA KLASY - Wybiera elementy/elementy za pomocą nazwy klasy CSS.

Przez.CSS_Selector - Wybiera elementy/elementy za pomocą selektora CSS.

Przez.ID - Wybiera element według identyfikatora

Przez.NAZWA - Wybiera elementy/elementy według nazwy.

Przez.NAZWA ZNACZNIKA - Wybiera elementy/elementy według nazwy znacznika HTML.

Przez.TEKST LINKU - Wybiera elementy/elementy według tekstu linku A (kotwica) tag html.

Przez.Parial_link_text - Wybiera elementy/elementy według częściowego tekstu linku A (kotwica) tag html.

Aby uzyskać więcej informacji na ten temat, odwiedź stronę dokumentacji API Python Selenium.

Oczekiwane warunki w wyraźnych oczekiwaniach:

We wcześniejszym wyraźnym przykładzie oczekiwałem obecność_of_element_located () metoda Oczekiwane_kondacje Jako wyraźny warunek oczekiwania upewnia się, że element, którego szukałem, istnieje przed wybraniem.

Są inne Oczekiwane_kondacje Możesz użyć jako wyraźnego warunku oczekiwania. Niektórzy z nich są:

title_is (tytuł) - sprawdza, czy tytuł strony jest tytuł.

title_contains (parial_title) - sprawdza, czy tytuł strony zawiera część tytułu Partial_title.

visibility_of (element) - sprawdza, czy element jest widoczny na stronie, która jest elementem ma szerokość i wysokość większą niż 0.

visibility_of_element_located (lokalizator) -

obecność_of_element_located (lokalizator) - Upewnij się, że element zlokalizowany (przez lokalizator) jest obecny na stronie. lokalizator jest krotą (Przez, selektor), Jak pokazałem w przykładzie wyraźnego oczekiwania.

obecność_of_all_element_located () - Upewnia się, że cały element dopasowany przez lokalizator jest obecny na stronie. lokalizator jest (Przez, selektor) Tuple.

text_to_be_present_in_element (lokalizator, tekst) - Sprawdza, czy tekst jest obecny w elemencie zlokalizowanym przez lokalizator. lokalizator jest (Przez, selektor) Tuple.

element_to_be_clickable (lokalizator) - Sprawdza, czy element znajdujący się według lokalizator jest widoczny i klikalny. lokalizator jest (Przez, selektor) Tuple.

element_to_be_selected (lokalizator) - Sprawdza, czy element znajdujący się według lokalizator jest zaznaczona. lokalizator jest (Przez, selektor) Tuple.

alert_is_present () - Spodziewaj się, że okno dialogowe Alert będzie obecne na stronie.

Jest ich o wiele więcej Oczekiwane_kondacje Dostępne dla Ciebie. Aby uzyskać więcej informacji na ten temat, odwiedź stronę dokumentacji API Python Selenium.

Wniosek:

W tym artykule omówiłem domyślne i wyraźne oczekiwania Selenu. Pokazałem również, jak pracować z domyślnym i wyraźnym oczekiwaniem. Zawsze powinieneś spróbować użyć wyraźnego oczekiwania w projektach selenium, ponieważ selen spróbuje w jak największym stopniu skrócić czas oczekiwania. W ten sposób nie będziesz musiał czekać na określoną liczbę sekund za każdym razem, gdy uruchamiasz projekty selenium. Jawne oczekiwanie powinno zaoszczędzić wiele sekund.

Aby uzyskać więcej informacji na temat Selenium Waits, odwiedź oficjalną stronę dokumentacji biblioteki selenium Python Waits.