1. Podstawy techniczne
Wypełnianie i wysyłanie formularzy
Praca z formularzami jest często potrzebna do automatyzacji rejestracji użytkowników, wypełniania ankiet, zbierania danych i wielu innych rzeczy. Kiedy musisz wypełnić setki formularzy, ręczne zrobienie tego to jak próba zjedzenia arbuza przez słomkę. Dzięki naszym supermocom z Selenium zrobimy to w kilka sekund.
Najpierw zorientujmy się, jak możemy wypełniać pola tekstowe i wysyłać formularze. Na przykładzie typowego formularza logowania na stronie internetowej przeanalizujemy podstawowe kroki:
from selenium import webdriver
# Konfiguracja drivera (np. ChromeDriver)
driver = webdriver.Chrome()
try:
# Otwieranie strony internetowej
driver.get("https://example.com/login")
# Znajdowanie pola wprowadzania dla nazwy użytkownika i wpisywanie tekstu
username_input = driver.find_element_by_name("username")
username_input.send_keys("mój_login")
# Znajdowanie pola wprowadzania dla hasła i wpisywanie tekstu
password_input = driver.find_element_by_name("password")
password_input.send_keys("moje_hasło")
# Znajdowanie przycisku do wysyłania formularza i kliknięcie go
submit_button = driver.find_element_by_name("submit")
submit_button.click()
finally:
# Zamknięcie drivera
driver.quit()
Walidacja i obsługa błędów
Nic bardziej nie psuje dnia programisty niż błędy wyskakujące w nieodpowiednim momencie. Dlatego obsługujemy je wcześniej. Używamy try/except
, aby przechwycić błędy i prowadzimy logi, aby zrozumieć, co poszło nie tak.
try:
username_input = driver.find_element_by_name("username")
username_input.send_keys("mój_login")
except Exception as e:
print(f"Błąd podczas wypełniania nazwy użytkownika: {e}")
logging.error("Błąd podczas wypełniania nazwy użytkownika", exc_info=True)
2. Checkboxy (Checkboxes)
Skoro już nauczyliśmy się klikać przyciski, spróbujmy wybrać kilka opcji z listy. Aby zaznaczyć lub odznaczyć checkbox, można również użyć metody click()
. Jeśli potrzebujemy sprawdzić, czy checkbox jest zaznaczony, używamy atrybutu is_selected()
.
checkbox = driver.find_element_by_id("checkbox_id")
if not checkbox.is_selected():
checkbox.click()
3. Radio Buttony (Radio Buttons)
Przyciski radiowe pozwalają wybierać tylko jedną opcję z kilku. Pracować z nimi można jak z checkboxami: wybierać opcję za pomocą metody click()
i sprawdzać stan za pomocą is_selected()
.
radio_button = driver.find_element_by_id("radio_button_id")
if not radio_button.is_selected():
radio_button.click()
4. Dropdowny (Dropdowns)
Dropdowny zawierają kilka opcji do wyboru. W Selenium jest klasa Select
, która dostarcza metody do pracy z takimi listami.
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element_by_id("dropdown_id"))
dropdown.select_by_visible_text("Option 1")
Można również wybierać opcje za pomocą select_by_index()
lub select_by_value()
.
5. Pola tekstowe (Text Areas)
Pola tekstowe są podobne do pól tekstowych, ale zazwyczaj są używane do wprowadzania dużej ilości tekstu. Praca z nimi odbywa się w taki sam sposób, jak z polami tekstowymi.
text_area = driver.find_element_by_id("textarea_id")
text_area.send_keys("To jest przykładowy tekst dla pola tekstowego.")
6. Kalendarz (Date Picker)
Pola kalendarza pozwalają użytkownikom wybierać daty. Jeśli jest to zwykłe pole tekstowe obsługujące format daty, można użyć send_keys()
, aby wprowadzić wartość w odpowiednim formacie.
date_field = driver.find_element_by_id("date_field_id")
date_field.send_keys("2023-12-25") # Format daty może się różnić w zależności od strony
Niekiedy jednak pola kalendarza wymagają dodatkowych działań, takich jak otwarcie wyskakującego kalendarza i wybór daty.
7. Pola do przesyłania plików (File Upload)
Te pola pozwalają przesyłać pliki na serwer. Interakcja z nimi odbywa się również za pomocą metody send_keys()
, podając ścieżkę do pliku na komputerze lokalnym.
file_input = driver.find_element_by_id("file_upload_id")
file_input.send_keys("/path/to/file.txt")
8. Pola ukryte (Hidden Fields)
Pola ukryte nie są widoczne na stronie, ale mogą być używane do przechowywania informacji potrzebnych do wysyłania formularza. Interakcja z nimi jest możliwa tylko wtedy, gdy mamy dostęp do ich wartości (np. w celu sprawdzenia lub zmiany wartości).
hidden_field = driver.find_element_by_id("hidden_field_id")
value = hidden_field.get_attribute("value")
print("Wartość ukrytego pola:", value)
9. Sprawdzanie poprawności wykonania działań
Uzyskiwanie danych o wykonanych działaniach to Twój barometr sukcesu. Po wysłaniu formularza na pewno chcesz się upewnić, że wniosek został pomyślnie przyjęty, prawda? Oto jak to zrobić:
># Sprawdzanie poprawności logowania na stronie
if "Witamy" in driver.page_source:
print("Logowanie zakończone sukcesem!")
else:
print("Wystąpił błąd podczas logowania.")
10. Problemy i rozwiązania
Problemy
- Nieprzewidywalność działania: Strony internetowe często się zmieniają. Zmiana struktury strony może prowadzić do awarii skryptów, dlatego regularna kontrola kodu pod kątem aktualności jest konieczna.
- Zależność od szybkości sieci: Czas ładowania stron i elementów może się różnić. Używaj widocznych oczekiwań (explicit waits) do obsługi opóźnień.
Rozwiązania
- Logowanie: Prowadź log wszystkich działań, aby lepiej rozumieć problemy. Użycie biblioteki
logging
znacznie ułatwi prowadzenie logów. - Modularność kodu: Dziel skomplikowane działania na funkcje i moduły, aby łatwiej wprowadzać zmiany i testować je.
GO TO FULL VERSION