1. Podstawy wyszukiwania elementów na stronie
Użycie metod wyszukiwania elementów
Gdy zaczynasz korzystać z Selenium w prawdziwych projektach, jedną z pierwszych zadań będzie wyszukiwanie elementów na stronie. To można porównać do szukania przycisku windy w hotelu: musisz wiedzieć, gdzie się znajduje, żeby go nacisnąć i pojechać na odpowiednie piętro.
Selenium daje kilka metod do wyszukiwania elementów. W zależności od twoich preferencji, możesz użyć find_element_by_id, find_element_by_name, find_element_by_xpath, find_element_by_css_selector, itd. Pamiętajmy, co już wiesz - i napiszmy prosty przykład:
from selenium import webdriver
# Tworzymy instancję przeglądarki (tutaj używamy Chrome)
driver = webdriver.Chrome()
# Otwieramy stronę
driver.get('http://example.com')
# Wyszukiwanie elementu po ID
element_by_id = driver.find_element_by_id('main')
# Wyszukiwanie elementu po nazwie
element_by_name = driver.find_element_by_name('username')
# Wyszukiwanie elementu po XPath
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# Wyszukiwanie elementu po selektorze CSS
element_by_css = driver.find_element_by_css_selector('div.content')
Różnice między find_element i find_elements
Jeśli masz kilka elementów, które chcesz znaleźć (na przykład wszystkie przyciski z klasą btn), potrzebujesz metody find_elements. Różnica między find_element i find_elements polega na tym, że pierwsza zwraca jeden element, a druga zwraca listę elementów.
# Wyszukiwanie jednego elementu
single_element = driver.find_element_by_class_name('btn')
# Wyszukiwanie kilku elementów
multiple_elements = driver.find_elements_by_class_name('btn')
# Iterowanie przez znalezione elementy
for element in multiple_elements:
print(element.text)
Jak widzisz, find_elements świetnie sprawdza się do pracy z kolekcjami elementów, które mogą być liczne na stronie. Każda metoda find_element_xxx ma swój find_elements_xxx, która zwraca listę elementów.
2. Interaktywna interakcja z elementami
Interakcja z przyciskami, linkami i polami tekstowymi
Teraz, gdy przypomniałeś sobie, jak wyszukiwać elementy, czas przypomnieć sobie, jak z nimi współpracować! To jak składanie zestawu LEGO: musisz odpowiednio połączyć elementy, żeby osiągnąć to, co zamierzasz.
Interakcja z elementami może zostać osiągnięta dzięki metodom oferowanym przez Selenium. Spójrzmy jeszcze raz, jak to się robi:
# Kliknięcie na przycisk
button = driver.find_element_by_id('submit')
button.click()
# Wpisywanie tekstu w pole tekstowe
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# Pobieranie tekstu z elementu
header = driver.find_element_by_tag_name('h1')
print(header.text)
Obsługa zdarzeń i działania z dynamicznymi elementami
Kiedy przychodzi czas na pracę z dynamicznymi elementami, takimi jak przyciski, które pojawiają się dopiero po określonej akcji, ważne jest uwzględnienie opóźnień i oczekiwań. Selenium oferuje sposoby czekania na załadowanie takich elementów. Na przykład za pomocą klasy WebDriverWait w połączeniu z expected_conditions.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Oczekiwanie na pojawienie się przycisku przez 10 sekund
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
Uwaga. Aby nie pisać za każdym razem expected_conditions, zmieniliśmy jego nazwę przy imporcie na EC.
Użycie oczekiwania sprawia, że twój skrypt jest bardziej niezawodny i nie psuje się przez chwilowe opóźnienia lub wolne ładowanie strony. A w praktyce to zdarza się bardzo często - niemal zawsze :)
3. Co może pójść nie tak?
Wszystko. Wszystko może pójść nie tak. Właśnie przygotowałeś się na interakcję z elementami, ale nagle bum, coś poszło nie tak. Porozmawiajmy o typowych błędach, które mogą cię spotkać po drodze.
Po pierwsze, NoSuchElementException — to wiadomość o błędzie, którą zobaczysz dość często, zwłaszcza jeśli element, którego szukasz, nie istnieje na stronie. Jest wywołany, gdy próbujesz znaleźć element, którego nie ma. Aby zapobiec takim sytuacjom, możesz użyć metody try-except do obsługi wyjątków.
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("Ups, chyba element nie został znaleziony!")
Możliwe są również problemy z dynamicznymi elementami i czasem ładowania. W takim przypadku poczekaj na załadowanie elementów za pomocą WebDriverWait, jak omówiliśmy wcześniej.
GO TO FULL VERSION