Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Test Python su WordPress: il login

Effettuiamo un test Python sul funzionamento del login di WordPress approfondendo anche il nostro discorso sul waiting
Effettuiamo un test Python sul funzionamento del login di WordPress approfondendo anche il nostro discorso sul waiting
Link copiato negli appunti

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).

Gli id che ci interessano

Figura 1. Gli id che ci interessano

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 titolo della bacheca

Figura 2. Il titolo della bacheca

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".

Ti consigliamo anche