1. Scenariusz działań i jego sekwencja
Kiedy zaczynamy planowanie scenariusza automatyzacji, ważne jest, aby zrozumieć, że tak jak w bajkach, trzeba iść od prostego do skomplikowanego. Wyobraź sobie, że twój skrypt to bohater, który wyrusza w podróż po stronach internetowych. Każdy krok jest przemyślany i odpowiednio skonfigurowany, aby się nie zgubić.
Tworzenie szczegółowego scenariusza automatyzacji
Na początku warto stworzyć plan. Co chcesz osiągnąć? Załadować stronę, wypełnić formularz, kliknąć przycisk? Jak to mawiają: „Kto nie planuje, ten planuje porażkę”. Porażki nie chcemy, więc rozpiszmy proponowane kroki.
from selenium import webdriver
from selenium.webdriver.common.by import By
# Tworzymy instancję drivera. Użyj drivera, który odpowiada twojej przeglądarce.
driver = webdriver.Chrome()
# Otwieramy stronę
driver.get('https://example.com/login')
# Wypełniamy login
driver.find_element(By.NAME, 'username').send_keys('my_username')
# Wypełniamy hasło
driver.find_element(By.NAME, 'password').send_keys('my_secure_password')
# Klikamy przycisk logowania
driver.find_element(By.ID, 'login-button').click()
W ten sposób ustawiamy rytm naszego tańca. Każdy krok scenariusza wykonywany jest w określonej kolejności, aby skrypt mógł swobodnie poruszać się po stronie.
Logowanie kroków wykonania
Jak każdy szanujący się bohater, nasz skrypt powinien zostawiać ślady, abyśmy wiedzieli, gdzie był i co robił. Logowanie to jak dziennik twojego skryptu. Pomaga śledzić wykonywanie kroków i diagnozować błędy, jeśli coś pójdzie nie tak.
import logging
# Konfigurujemy logowanie
logging.basicConfig(level=logging.INFO)
# Przykład logowania działania
logging.info("Otwieramy stronę logowania")
driver.get('https://example.com/login')
Logowanie nie tylko pomaga w debugowaniu, ale także daje spokój ducha, wiedząc, że twój skrypt wykonuje każdy krok poprawnie. Jeśli coś pójdzie nie tak, będziesz w stanie wrócić i zobaczyć, na którym etapie coś poszło nie tak.
2. Organizacja kodu dla czytelności i modyfikacji
Kiedy scenariusz staje się bardziej złożony, ważne jest, aby utrzymać porządek w kodzie. Wyobraź sobie jubileuszowe przyjęcie z masą gości i jedzenia: jeśli wszystko nie będzie uporządkowane, zrobi się chaos. W naszym przypadku — chaos w kodzie.
Konfiguracja struktury kodu
Aby wprowadzenie zmian w kodzie było jak najmniej pracochłonne, musi być dobrze zorganizowany. Jak sortownik skarpetek, trzeba wszystko uporządkować. Używaj funkcji, aby oddzielić powtarzające się działania w oddzielne bloki.
def login_to_site(driver, username, password):
logging.info("Wprowadzamy login")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("Wprowadzamy hasło")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("Klikamy przycisk logowania")
driver.find_element(By.ID, 'login-button').click()
# Używamy funkcji do logowania
login_to_site(driver, 'my_username', 'my_secure_password')
Użycie funkcji sprawia, że kod jest bardziej uporządkowany i ułatwia wprowadzanie zmian,
na przykład gdy zmieni się ID
przycisku logowania, wystarczy zmienić to
w jednej funkcji, a nie w całym kodzie.
3. Przykład: Automatyzacja procesu zakupu na stronie
Wyobraź sobie, że musimy skonfigurować automatyzację procesu zakupu na stronie, obejmującą następujące kroki:
- Otwieranie strony i logowanie do konta.
- Przejście do katalogu produktów i dodanie produktu do koszyka.
- Przejście do koszyka i realizacja zakupu.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Inicjalizacja drivera z ustawieniami
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # Domyślne oczekiwanie
return driver
# Funkcja logowania do konta
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# Funkcja przejścia do katalogu produktów i dodania produktu do koszyka
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# Funkcja przejścia do koszyka i realizacji zakupu
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# Funkcja kończenia pracy drivera
def close_driver(driver):
driver.quit()
# Główny skrypt do wykonania sekwencji działań
def main():
# Konfiguracja danych
username = "myusername"
password = "mypassword"
# Inicjalizacja drivera
driver = initialize_driver()
try:
# Logowanie na stronę
login(driver, username, password)
# Przejście do katalogu i dodanie produktu do koszyka
add_product_to_cart(driver)
# Przejście do koszyka i realizacja zakupu
checkout(driver)
finally:
# Zamknięcie drivera
close_driver(driver)
# Uruchamianie głównego skryptu
main()
Wyjaśnienie funkcji
-
initialize_driver()
— funkcja do inicjalizacji web-drivera. Ustawia domyślne oczekiwanie dla wszystkich elementów i zwraca obiekt drivera. -
login()
— funkcja do logowania na stronę. Przyjmuje parametryusername
ipassword
, które są używane do wypełnienia formularza logowania i kliknięcia przycisku. -
add_product_to_cart()
— funkcja do przejścia do katalogu, wyboru produktu i dodania go do koszyka. -
checkout()
— funkcja do przejścia do koszyka i realizacji zakupu. -
close_driver()
— funkcja do zakończenia pracy z driverem. -
main()
— główna funkcja zarządzająca sekwencją działań. W niej wywoływane są wszystkie etapy, a także określane dane do logowania.
Zalety tego podejścia
-
Czytelność
— każdy etap jest oddzielnie opisany, co upraszcza zrozumienie kodu. -
Ponowne użycie
— pojedyncze funkcje można używać niezależnie od głównego skryptu, na przykład do wykonania pojedynczych działań na stronie. -
Łatwość testowania
— każdy etap można przetestować oddzielnie, aby upewnić się, że wszystko działa poprawnie. -
Elastyczność
— w razie potrzeby można dodać nowe funkcje lub zmienić kolejność wywołań wmain()
.
GO TO FULL VERSION