Se dovere verificare che tutto sia in ordine in varie pagine web, e ritenete, ad esempio, che il fatto che si carichino sia sufficiente a certificarne il buon funzionamento (ma si possono fare cose più complesse, tipo fare un login), potreste usare uno script di Python con il pacchetto Selenium.
Selenium è tanto una interfaccia utente “Selenium IDE” distribuita come plugin di Firefox (Firefox add-on), quanto un pacchetto per vari programmi (java, csharp, python, ruby, php, perl, javascript).
Leggete il seguito per avere una traccia su come usare Selenium.
Vale la pena di iniziare vedendo se, nel vostro PC con sistema operativo linux, il pacchetto è installato. Digitando da shell il comando python -c “import nome_pacchetto” si ha questa informazione (nulla se è installato, “No module named nome_pacchetto” se non lo è).
ca@A:~$ python -c “import numpy”
ca@A:~$
ca@A:~$ python -c “import Selenium”
Traceback (most recent call last):
File “<string>”, line 1, in <module>
ImportError: No module named Selenium
ca@A:~$ sudo pip install Selenium[sudo] password for ca:
Downloading/unpacking Selenium
Downloading selenium-2.53.5-py2.py3-none-any.whl (884kB): 884kB downloaded
Installing collected packages: Selenium
Successfully installed Selenium
Cleaning up…ca@A:~$
Altra cosa importante, anch’essa una premessa alla attività di test: se non ricordate che tipo di informazioni contiene la pagina che volete controllare, meglio vedere esplicitamente il codice html della pagina.
Lo si fa con il comando control + u nel browser Chrome.
Per esempio, schiacciando control + u mentre si è nella pagina http://t.ndrini.eu/, si apre una nuova scheda (quella che in inglese si chiama tab) e nell’indirizzo appare, giustamente, view-source:t.ndrini.eu, mentre la pagina vera è propria e rappresentata dal codice html, che cercavamo.
<!DOCTYPE html>
<html>
<body>
<h1>Section t</h1>
<p>Para el TDD</p>
</body>
</html>
Quindi, ad esempio, potremmo voler verificare se un elemento h1 contenente la parola “section” si trova nella pagina http://t.ndrini.eu/. Questo già ci darebbe utili informazioni sul funzionamento del sito web.
Passiamo ora al codice in Python, vero e proprio.
Importiamo i moduli necessari, che non sono poi molti, dato che serve il diffusissimo unittest (per l’esecuzione di test unitari) e appunto selenium.
from selenium import webdriver
import unittest
definiamo una classe di unittest
class UnitTestExample(unittest.TestCase):
come noto, setUp, prima di ogni test, esegue alcune azioni preliminari. Nel nostro caso, definisce un browser con il quale vistare il sito (chiamato driver) e pazienta (implicitly_wait(numero di secondi)) per essere sicuro di avere i dati in caso di connessione lenta. C’è anche la possibilità di una attesa esplicita, con il codice che segue, ma l’importante è non mischiare le due modalità.
try:
title = WebDriverWait(self.driver , 15).until( ff.find_element_by_tag_name(‘h1’).text )
finally:
self.driver.quit()
Torniamo quindi al codice, dopo la definizione della classe, mettiamo:
def setUp(self):
self.driver = webdriver.Firefox() # note that this
#creates a class instance variable
self.driver.implicitly_wait(15) # when testing AJAX
#this would not be used
self.driver.get(“http://t.ndrini.eu”)
quindi scriviamo il test vero e proprio, ora siamo già collegati (si spera) al sito di interesse.
def test_t_ndrini_eu(self): # a first test case.
#There can be others
title = self.driver.find_element_by_tag_name(‘h1’).text
self.assertEqual(title, “Section t”)
self.driver.implicitly_wait(15) # I had to add this, if not, browser close too early!!
Notate il find_element_by_tag_name, che nel codice html, prende esattamente e solo l’elemento con il tag specificato. Serve aggiungere .text, se vogliamo il contenuto testuale dell’elemento, e non altro, altrimenti si avranno degli errori, quali:
AssertionError: [<selenium.webdriver.remote.webelement.WebElement (session=”f569d768-ea7a-459c-9337-d4c8479e1b39″, element=”{bb6b22bd-a8a3-4744-9ad6-1261718af80b}”)>] != ‘Section t’
perché una variabile è qualche cosa di più del suo contenuto testuale!
Notate anche che esiste il comando find_element_by_tag_name ed il comando find_elements_by_tag_name: questo secondo restituisce una lista!!
cancelliamo infine con il tearDown la classe driver, per non creare inutili interazioni.
def tearDown(self):
self.driver.quit()
if __name__ == “__main__”: # allows unittest to start by running this class file
unittest.main() # start the main method of unittest
Una serie di errori possibili:
- legati alla versione di firefox (superiori alla 47)
- vedete la versione con il comando
-
firefox -v
-
-
potete usare marionette
- potete installare una versione precedente di firefox (controllando prima, quali sono disponibili e bloccando l’aggiornamento)
- sudo apt-get purge firefox
apt-cache show firefox | grep Version
sudo apt-get install firefox=28.0+build2-0ubuntu2
sudo apt-mark hold firefox
- sudo apt-get purge firefox
- vedete la versione con il comando
Per una trattazione completa vi invitiamo a leggere questo articolo Test_Automation_with_Selenium_(Python_Track). Se siete appassionati di tutorial video, per iniziare, consigliamo questo.
Un altro modo di procedere è lavorare da una macchina virtuale (più esattamente da server virtuale). Avevamo già presentato un esempio di server vistale EC2.
Si tratta in questo caso di lavorare in un ambiente solo testo, indicato in lingua inglese come Headless o Console based ed in genere comandato tramite ssh.
Nel caso si sia seguita la nostra configurazione (installando ubuntu server), si dovranno installare alcuni programmi ancora: firefox, pip e Selenium.
$ sudo apt-get install firefox
$ sudo apt-get install python-pip
$ sudo pip install Selenium
Ora si può eseguire il file (se ci si trova nella cartellina che lo contiene)
a@ip-172-31-30-44:~/test$ python test_yahoo.py