1. Podstawy wyszukiwania elementów
Metody wyszukiwania elementów
Zanim skoczymy na głęboką wodę z kodem, ważne jest, aby zrozumieć, w jaki sposób możemy wyszukiwać elementy na stronie za pomocą Selenium. Selenium oferuje kilka przydatnych metod do wyszukiwania elementów:
-
find_element_by_id(): Wyszukuje element po jego unikalnym identyfikatorze (id). -
find_element_by_name(): Pozwala znaleźć element za pomocą jego atrybutuname. -
find_element_by_class_name(): Szuka elementów, które mają określoną klasę (class). -
find_element_by_tag_name(): Używa nazwy tagu do wyszukiwania elementów, np.div,p,a.
Ważne: to składnia Selenium 3. W Selenium 4 te metody zostały usunięte — nowoczesny odpowiednik z By omawiamy w następnym rozdziale.
Zacznijmy od prostego przykładu - wyszukiwania elementu za pomocą id. Wyobraźmy sobie, że zgubiliśmy przycisk z napisem "Magiczny przycisk" i musimy go znaleźć:
from selenium import webdriver
# Konfiguracja drivera i otwieranie przeglądarki
driver = webdriver.Chrome()
driver.get('https://example.com')
# Wyszukiwanie elementu za pomocą id
magic_button = driver.find_element_by_id('magic_button_id')
# Praca z odnalezionym elementem (np. pobieranie tekstu)
print(magic_button.text)
# Zakończenie sesji
driver.quit()
Praca z odnalezionymi elementami
Po odnalezieniu elementu czas zdecydować, co z nim zrobić. Włączamy wyobraźnię i stosujemy metody Selenium, takie jak text w celu uzyskania tekstowej zawartości elementu lub get_attribute('attribute_name'), aby pobrać wartość dowolnego atrybutu elementu.
Załóżmy, że nasz element to link i chcemy dowiedzieć się, dokąd prowadzi. Oto jak to zrobić:
# Wyszukiwanie elementu z linkiem
link_element = driver.find_element_by_class_name('link_class')
# Pobranie URL z atrybutu href
link_url = link_element.get_attribute('href')
print(f'Ten link prowadzi do: {link_url}')
2. Selenium 4: nowoczesne wyszukiwanie przez By
Wszystko, co opisano dalej w tej lekcji, to klasyczna składnia Selenium 3. W Selenium 4 metody find_element_by_* najpierw oznaczono jako przestarzałe, a od wersji Selenium 4.3.0 usunięto je całkowicie. Jeśli uruchomisz taki kod na aktualnej wersji biblioteki, dostaniesz AttributeError.
Zamiast zestawu osobnych metod została jedna uniwersalna find_element(): pierwszym argumentem przekazuje się strategię wyszukiwania z klasy By, a drugim samą wartość. Klasę By trzeba zaimportować osobno:
from selenium.webdriver.common.by import By
Tabela odpowiedników
| Selenium 3 | Selenium 4 | Co robi |
|---|---|---|
find_element_by_id('magic_button_id') |
find_element(By.ID, 'magic_button_id') |
Wyszukuje element po jego unikalnym identyfikatorze (id). |
find_element_by_name('name') |
find_element(By.NAME, 'name') |
Pozwala znaleźć element za pomocą jego atrybutu name. |
find_element_by_class_name('class') |
find_element(By.CLASS_NAME, 'class') |
Szuka elementów, które mają określoną klasę (class). |
find_element_by_tag_name('tag') |
find_element(By.TAG_NAME, 'tag') |
Używa nazwy tagu do wyszukiwania elementów, np. div, p, a. |
Tak samo zmieniło się wyszukiwanie wszystkich pasujących elementów: zamiast zestawu find_elements_by_*() jest teraz jedno find_elements() z tymi samymi strategiami By. Poza czterema wymienionymi klasa By udostępnia jeszcze By.XPATH, By.CSS_SELECTOR, By.LINK_TEXT i By.PARTIAL_LINK_TEXT — o nich porozmawiamy w kolejnych lekcjach.
Ten sam przykład, ale w Selenium 4
from selenium import webdriver
from selenium.webdriver.common.by import By
# Konfiguracja drivera i otwieranie przeglądarki
driver = webdriver.Chrome()
driver.get('https://example.com')
# Wyszukiwanie elementu za pomocą id
magic_button = driver.find_element(By.ID, 'magic_button_id')
# Praca z odnalezionym elementem (np. pobieranie tekstu)
print(magic_button.text)
# Zakończenie sesji
driver.quit()
Jak widzisz, zmienił się tylko wiersz wyszukiwania — cała reszta działa dokładnie tak samo: metoda zwraca ten sam obiekt elementu z tymi samymi text, get_attribute(), click() i send_keys().
Dalej w lekcji każda metoda jest omówiona w klasycznej postaci find_element_by_* — właśnie tak spotkasz ją w starym kodzie i w części zadań. Przeniesienie dowolnej z nich na Selenium 4 to za każdym razem jedno mechaniczne podstawienie według tabeli powyżej.
3. Metoda find_element_by_id()
Metoda find_element_by_id() – jedna z najszybszych i najbardziej niezawodnych metod wyszukiwania elementów na stronie. Pozwala znaleźć elementy za pomocą ich unikalnego atrybutu id. W HTML atrybut id jest unikalnym identyfikatorem, dlatego możemy być pewni, że metoda zwróci jedyny potrzebny element.
Przykład użycia:
element = driver.find_element_by_id("submit-button")
W tym przykładzie Selenium szuka elementu z id="submit-button" i zapisuje go w zmiennej element. Takie podejście jest wygodne do wyszukiwania przycisków, formularzy, pól wprowadzania i innych unikalnych elementów, które rzadko są duplikowane na stronie.
Kiedy używać?
Stosowanie find_element_by_id() jest zalecane zawsze, gdy element ma unikalny identyfikator id, ponieważ ta metoda zapewnia szybki i precyzyjny dostęp do elementu.
4. Metoda find_element_by_name()
Metoda find_element_by_name() szuka elementów po atrybucie name. Jest często używana do formularzy i pól wprowadzania, szczególnie gdy elementy mogą mieć takie same klasy lub id, ale różne name. W przeciwieństwie do id, atrybut name nie musi być unikalny, a czasami na stronie może być kilka elementów z tą samą wartością name.
Przykład użycia:
element = driver.find_element_by_name("username")
Ten kod wyszukuje element z name="username". Zwykle jest to pole do wprowadzania nazwy użytkownika w formularzach logowania.
Kiedy używać?
Ta metoda jest przydatna, jeśli element nie ma na stronie unikalnego id, ale ma atrybut name. Jest szczególnie skuteczna dla formularzy, gdzie elementy często mają identyfikację za pomocą name.
5. Metoda find_element_by_class_name()
Metoda find_element_by_class_name() szuka elementu po jego klasie (class). Jest przydatna przy pracy z CSS i pozwala znaleźć elementy o takim samym stylu. Należy pamiętać, że class może być przypisany do kilku elementów, dlatego, jeśli potrzebujemy znaleźć tylko jeden element, ważne jest określenie unikalnej klasy lub użycie innej metody.
Przykład użycia:
element = driver.find_element_by_class_name("main-header")
W tym przykładzie Selenium szuka pierwszego elementu z klasą main-header.
Kiedy używać?
find_element_by_class_name() jest często używana do wyszukiwania nagłówków, przycisków i innych stylizowanych elementów. Ta metoda jest szczególnie przydatna, jeśli elementy nie mają unikalnego id ani name, a także w przypadkach, gdy chcemy wyszukiwać elementy po stylach.
6. Metoda find_element_by_tag_name()
Metoda find_element_by_tag_name() szuka elementów po nazwie tagu, na przykład div, p, a, input. Jest przydatna do pobierania wszystkich elementów jednego typu, szczególnie jeśli struktura strony pozwala na łatwą nawigację po tagach.
Przykład użycia:
element = driver.find_element_by_tag_name("h1")
Tutaj Selenium szuka pierwszego elementu z tagiem h1, który zazwyczaj jest używany jako nagłówek strony.
Kiedy używać?
Metoda find_element_by_tag_name() dobrze nadaje się do wyszukiwania nagłówków, obrazów, akapitów i innych elementów reprezentowanych przez określony typ tagu na stronie. Jednak, ponieważ na stronie może być wiele elementów tego samego typu, ta metoda nie zawsze dokładnie wskaże konkretny element.
GO TO FULL VERSION