Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia Següent revisió Ambdós costats nova versio | ||
django_test [2023/02/07 18:37] enric_mieza_sanchez [Testejar que un element NO existeix] |
django_test [2024/01/03 17:11] enric_mieza_sanchez [Exercici] headless exercici deprecated |
||
---|---|---|---|
Línia 5: | Línia 5: | ||
Referències: | Referències: | ||
+ | * [[Django]] en aquesta wiki. | ||
* Pàgina oficial [[https:// | * Pàgina oficial [[https:// | ||
* [[https:// | * [[https:// | ||
Línia 144: | Línia 145: | ||
<WRAP tip> | <WRAP tip> | ||
- | **Necessitaràs instal·lar el geckodriver de Firefox** per permetre automatitzar l' | + | **Necessitaràs instal·lar el geckodriver de Firefox** per permetre automatitzar l' |
- | $ sudo apt install firefox-geckodriver | + | |
- | + | Per altra banda hem detectat que **les versions de Firefox de la botiga | |
+ | |||
+ | $ sudo snap remove firefox | ||
+ | $ sudo apt install firefox-esr | ||
També **cal instal·lar Selenium** al // | També **cal instal·lar Selenium** al // | ||
(env) $ pip install selenium | (env) $ pip install selenium | ||
Línia 152: | Línia 157: | ||
</ | </ | ||
- | Mostrem un exemple de com es pot connectar amb el panell /admin i fer un login. | + | Mostrem un exemple de com es pot connectar amb el panell /admin i fer un //login//. Hi hem afegit un control sobre el **mode // |
<file python tests.py> | <file python tests.py> | ||
Línia 166: | Línia 171: | ||
def setUpClass(cls): | def setUpClass(cls): | ||
super().setUpClass() | super().setUpClass() | ||
- | # així és com ho diu a la doc de Django | ||
- | # però necessitem una altra configuració pel mode headless | ||
- | # | ||
- | # | ||
opts = Options() | opts = Options() | ||
- | opts.headless = True | + | |
cls.selenium = WebDriver(options=opts) | cls.selenium = WebDriver(options=opts) | ||
cls.selenium.implicitly_wait(5) | cls.selenium.implicitly_wait(5) | ||
Línia 177: | Línia 178: | ||
@classmethod | @classmethod | ||
def tearDownClass(cls): | def tearDownClass(cls): | ||
+ | # no sortim el browser per comprovar visualment com ha anat | ||
# | # | ||
super().tearDownClass() | super().tearDownClass() | ||
Línia 182: | Línia 184: | ||
def test_login(self): | def test_login(self): | ||
self.selenium.get(' | self.selenium.get(' | ||
+ | | ||
+ | # comprovem que el títol de la pàgina és el què esperem | ||
+ | self.assertEqual( self.selenium.title , "Log in | Django site admin" ) | ||
+ | | ||
+ | # introduïm dades de login i cliquem el botó "Log in" per entrar | ||
username_input = self.selenium.find_element(By.NAME," | username_input = self.selenium.find_element(By.NAME," | ||
username_input.send_keys(' | username_input.send_keys(' | ||
Línia 187: | Línia 194: | ||
password_input.send_keys(' | password_input.send_keys(' | ||
self.selenium.find_element(By.XPATH,'// | self.selenium.find_element(By.XPATH,'// | ||
- | + | ||
+ | # comprovem que hem entrat al panell d' | ||
+ | self.assertEqual( self.selenium.title , "Site administration | Django site admin" ) | ||
+ | | ||
# Aquesta localització de l' | # Aquesta localització de l' | ||
- | # Si no localitza | + | # Si no localitza |
self.selenium.find_element(By.XPATH,"// | self.selenium.find_element(By.XPATH,"// | ||
</ | </ | ||
+ | ==== Mode Headless ==== | ||
<WRAP tip> | <WRAP tip> | ||
- | === Mode Headless === | ||
El mode // | El mode // | ||
- | Fixa't en què es pot activar i desactivar el **mode // | + | Fixa't en què es pot activar i desactivar el **mode // |
- | | + | |
De vegades ens interessarà veure el resultat dels tests amb el GUI, típicament per depurar i corregir els bugs quan els tests fallin. | De vegades ens interessarà veure el resultat dels tests amb el GUI, típicament per depurar i corregir els bugs quan els tests fallin. | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Testejar que un element NO existeix ===== | ||
+ | En l' | ||
+ | <code python> | ||
+ | # Aquesta localització de l' | ||
+ | # Si no localitza l' | ||
+ | self.selenium.find_element(By.XPATH,"// | ||
+ | </ | ||
<WRAP info> | <WRAP info> | ||
Línia 207: | Línia 227: | ||
</ | </ | ||
- | <WRAP todo> | + | Però què passa si volem comprovar que l' |
- | === Exercici ==== | + | |
- | No resulta molt còmode (i no és cap bona pràctica) haver de canviar el codi per poder deshabilitar el mode // | + | |
- | Utilitza les eines de '' | + | Un possible truc és cercar-ho i capturar l'excepció: |
- | * Per defecte els tests son sense GUI. | + | <tabbox Versió |
- | * Si poso la variable d' | + | |
- | * Es pot fer amb un '' | + | |
- | $ ./manage.py test</ | + | |
- | * També posant la variable abans de la instrucció a executar:< | + | |
- | * També es pot posar la nova variable a l' | + | |
- | </WRAP> | + | |
- | \\ | + | En aquesta versió, si el '' |
- | ===== Testejar que un element NO existeix ===== | + | El '' |
- | En l'exemple vist es veu com comprovar que un element HTML sí que existeix: | + | |
- | <code python> | + | |
- | # Aquesta localització de l'element ens serveix també a mode de ASSERT | + | |
- | # Si no localitza | + | |
- | self.selenium.find_element(By.XPATH,"// | + | |
- | </ | + | |
- | Però què passa si volem comprovar que l' | + | <file python tests.py> |
+ | from selenium.common.exceptions import NoSuchElementException | ||
+ | #... | ||
+ | try: | ||
+ | self.selenium.find_element(By.XPATH,"// | ||
+ | assert False, " | ||
+ | except NoSuchElementException: | ||
+ | pass | ||
+ | </ | ||
+ | |||
+ | <tabbox Versió amb Exception genèrica> | ||
+ | |||
+ | En aquesta versió, capturem totes les excepcions, i en cas que no n'hi hagi cap, llancem una '' | ||
- | Un possible truc és cercar-ho i capturar l' | ||
<file python tests.py> | <file python tests.py> | ||
- | trobat = False | ||
try: | try: | ||
self.selenium.find_element(By.XPATH,"// | self.selenium.find_element(By.XPATH,"// | ||
- | trobat = True | ||
except: | except: | ||
- | # l' | ||
- | # per tant, no fem res i la flag " | ||
pass | pass | ||
- | | + | |
- | # forcem el llançament d'una excepció per donar el test per erroni | + | |
raise Exception(" | raise Exception(" | ||
+ | # o bé | ||
+ | assert False, " | ||
</ | </ | ||
+ | |||
+ | </ | ||
\\ | \\ | ||
Línia 274: | Línia 290: | ||
- Crea un usuari amb permisos de " | - Crea un usuari amb permisos de " | ||
- Crea un usuari amb permisos de " | - Crea un usuari amb permisos de " | ||
+ | - Crea una '' | ||
</ | </ | ||