Il secondo test su WordPress che abbiamo in mente di sviluppare nel nostro testcase in Python consiste nel verificare la capacità di eseguire un login utilizzando le credenziali studente come username e topolino come password. Essenzialmente, il tutto consisterà nel passare i valori al form di login, come faremmo manualmente, e cliccare il pulsante "Accedi".
Per avere la conferma dell'avvenuto login dovremo vedere apparire un titolo con contenuto "Bacheca" e, dovendone attendere l'apparizione, applicheremo le tecniche di waiting implicito che abbiamo già conosciuto.
Iniziamo a cercare i punti forti dell'interfaccia su cui ci baseremo.
Come riconoscere gli elementi
Sulla pagina di login (che appare all'indirizzo wp-login
) siamo piuttosto fortunati in quanto tutti gli elementi che ci interessano hanno un id: i campi di testo saranno identificabili con user_login
(lo username), user_pass
(la password) e wp-submit
(il pulsante).
Queste informazioni sono state raccolte tramite inspection via browser (notare i riquadri rossi nella figura che segue).
Per verificare che l'accesso al backend sia stato consentito, attendiamo che appaia il titolo "Bacheca" presente in un tag h1
all'interno di un div
di classe wrap
. Come abbiamo spiegato si possono fare veloci test nella console del browser per verificare che effettivamente la query CSS composta porti esattamente all'elemento che ci interessa senza possibilità di confusione e sono prove che conviene sempre fare.
Nell'immagine che segue si vede come abbiamo fatto una ricerca per tutti i possibili elementi rispondenti al selettore CSS div.wrap h1
. La NodeList ottenuta contiene un solo elemento (lo si vede tra parentesi quadre) e richiedendo qual è (ovviamente, in posizione zero) ci viene risposto che è esattamente quello che cerchiamo:
Il codice Python
A questo punto possiamo procedere con la scrittura del test:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import unittest
class Testing(unittest.TestCase):
def setUp(self):
options = webdriver.ChromeOptions()
options.add_argument('--headless')
self.driver = webdriver.Chrome(options=options)
self.driver.get("http://172.19.0.3/wp-admin")
def test_login(self):
# valore timeout
secondi=5
# ricerca campi
username=self.driver.find_element(By.ID, "user_login")
password=self.driver.find_element(By.ID, "user_pass")
button=self.driver.find_element(By.ID, "wp-submit")
# impostazione valori
username.clear()
username.send_keys('studente')
password.clear()
password.send_keys('topolino')
# click sul pulsante
button.click()
# attesa per l'apparizione del titolo
titolo = WebDriverWait(self.driver, secondi).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "div.wrap h1")))
# test
self.assertEqual(titolo.text, "Bacheca")
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
Come si vede abbiamo messo alla prova tutto ciò che abbiamo imparato sui form per quanto riguarda ricerca campi e pressione di pulsanti. Per il discorso del waiting invece notiamo che viene attivata un'attesa con timeout ma scegliamo di non gestire eventuali eccezioni di TimeoutException
in modo da far fallire il test in caso di tempi di attesa più lunghi del previsto.
Qualora l'elemento apparisse prima dello scadere del timeout procederemmo per il test vero e proprio ed in tal caso, qualora il contenuto non fosse uguale a "Bacheca", otterremmo un AssertionError
.
Tutto ha funzionato alla perfezione ed il test ha avuto successo.
Ran 1 test in 10.131s
OK
Se ad esempio provassimo - come controprova - a verificare la presenza del testo "Bacheca del sito" otterremmo un output di questo tipo:
F
======================================================================
FAIL: test_login (__main__.Testing)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\test\wplogin.py", line 30, in test_login
self.assertEqual(titolo.text, "Bacheca del sito")
AssertionError: 'Bacheca' != 'Bacheca del sito'
- Bacheca
+ Bacheca del sito
----------------------------------------------------------------------
Ran 1 test in 7.007s
FAILED (failures=1)
che evidenzierebbe chiaramente per quale motivo il test Python è fallito: cercavamo "Bacheca del sito" e abbiamo trovato "Bacheca".