1. Basi della ricerca degli elementi sulla pagina
Uso dei metodi di ricerca degli elementi
Quando inizi a utilizzare Selenium in progetti reali, una delle prime cose da fare sarà cercare gli elementi sulla pagina. È un po' come cercare il bottone dell'ascensore in un hotel: devi sapere dove si trova per poterlo premere e andare al piano desiderato.
Selenium fornisce diversi metodi per trovare gli elementi. A seconda delle tue preferenze, puoi
usare find_element_by_id
,
find_element_by_name
,
find_element_by_xpath
,
find_element_by_css_selector
, e così via.
Ricordiamo quello che già sai e scriviamo un esempio semplice:
from selenium import webdriver
# Creiamo un'istanza del browser (qui usiamo Chrome)
driver = webdriver.Chrome()
# Apriamo la pagina
driver.get('http://example.com')
# Ricerca di un elemento tramite ID
element_by_id = driver.find_element_by_id('main')
# Ricerca di un elemento tramite nome
element_by_name = driver.find_element_by_name('username')
# Ricerca di un elemento tramite XPath
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# Ricerca di un elemento tramite selettore CSS
element_by_css = driver.find_element_by_css_selector('div.content')
Differenze tra find_element e find_elements
Quando hai più elementi da catturare (come ad esempio tutti i pulsanti con la classe btn
),
ti servirà il metodo find_elements
. La differenza tra find_element
e
find_elements
sta nel fatto che il primo restituisce un solo elemento, mentre il secondo restituisce una lista di elementi.
# Ricerca di un solo elemento
single_element = driver.find_element_by_class_name('btn')
# Ricerca di più elementi
multiple_elements = driver.find_elements_by_class_name('btn')
# Iterazione sugli elementi trovati
for element in multiple_elements:
print(element.text)
Come puoi vedere, find_elements
è ottimo per lavorare con collezioni di elementi che possono essere presenti più volte nella pagina.
Ogni metodo find_element_xxx
ha un suo find_elements_xxx
, che restituisce una lista di elementi.
2. Interazione interattiva con gli elementi
Interazione con pulsanti, link e campi di input
Ora che hai ricordato come trovare gli elementi, è il momento di ricordare come interagire con loro! È come giocare con un set di LEGO: devi connettere i pezzi giusti per ottenere ciò che vuoi.
L'interazione con gli elementi può essere fatta attraverso i metodi che Selenium mette a disposizione. Diamo un'altra occhiata a come farlo:
# Cliccare su un pulsante
button = driver.find_element_by_id('submit')
button.click()
# Inserire del testo in un campo di input
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# Ottenere il testo di un elemento
header = driver.find_element_by_tag_name('h1')
print(header.text)
Gestione di eventi e azioni con elementi dinamici
Quando si lavora con elementi dinamici, come pulsanti che appaiono solo dopo una certa azione,
è importante considerare ritardi e attese.
Selenium fornisce modi per aspettare il caricamento di tali elementi.
Uno di questi è l'uso della classe WebDriverWait
combinata con 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
# Attesa del pulsante per un massimo di 10 secondi
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
Nota. Per evitare di scrivere ogni volta expected_conditions
,
lo abbiamo abbreviato a EC
durante l'import.
Usare le attese rende il tuo script più affidabile e meno soggetto a errori causati da ritardi temporanei o caricamenti lenti della pagina. Nella pratica, questo succede molto spesso - quasi sempre :)
3. Cosa potrebbe andare storto?
Tutto. Tutto potrebbe andare storto. Ti sei appena preparato a interagire con gli elementi, e poi bam, qualcosa non funziona. Parliamo di alcuni errori tipici che potresti incontrare lungo il percorso.
Prima di tutto, c'è NoSuchElementException
- questo è un messaggio di errore che vedrai abbastanza spesso,
soprattutto se l'elemento che stai cercando non esiste nella pagina.
Si verifica quando provi a cercare un elemento che non c'è.
Per prevenire queste situazioni, puoi usare il metodo try-except
per gestire le eccezioni.
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("Oops, sembra che l'elemento non sia stato trovato!")
Possono anche verificarsi problemi con elementi dinamici e tempi di caricamento.
In questo caso, aspetta il caricamento degli elementi utilizzando WebDriverWait
, come abbiamo discusso prima.
GO TO FULL VERSION