Un grid de Selenium
Un grid de Selenium, pourquoi faire : pour avoir plusieurs clients pour lancer des tests en parallèle, distribuer des tests en fonction de la plateform …
On va maintenant voir comment mettre en place une plate-forme sous linux de test pour lancer à la fois des tests via firefox sur un pc portable et sous un téléphone android.
Installation du Selenium Maître
On télécharge Selenium : http://selenium.googlecode.com/files/selenium-server-standalone-2.40.0.jar
Et il suffit de lancer :
java -jar selenium-server-standalone-2.40.0.jar -role hub
Si tout est ok, on obtient :
avr. 09, 2013 9:52:15 PM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a selenium grid server
2013-04-09 21:52:15.964:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT
2013-04-09 21:52:16.000:INFO:osjsh.ContextHandler:started o.s.j.s.ServletContextHandler{/,null}
2013-04-09 21:52:16.007:INFO:osjs.AbstractConnector:Started SocketConnector@0.0.0.0:4444
On peut se connecter à la console en appelant l’url suivante : http://localhost:4444/grid/console
Installation d’un Selenium esclave
On retélécharge l’archive (sauf si on est sur la même machine) et on lance un client.
java -jar selenium-server-standalone-2.31.0.jar -role node -hubHost localhost
Il suffit de remplacer localhost par l’adresse du Selenium Maître
On regarde la console et vous avez l’affichage d’un RemoteProxy
Lancement d’un premier test
On reprend le code de l’article Android + Selenium + Python : test d’une page web sur mobile
Ce qui donne pour un test sous firefox test_firefox.py:
from selenium import webdriver
driver=webdriver.Remote('http://localhost:8080/wd/hub',webdriver.DesiredCapabilities.FIREFOX)
driver.get('http://www.google.fr')
input=driver.find_element_by_name("q")
input.send_keys('Selenium')
btn=driver.find_element_by_name("btnG")
btn.click()
on lance le test :
python test_firefox.py
Installation pour android
Les Etapes sont :
on installe l’apk webdriver pour android sur le terminal : APK pour Android on lance l’application on utilise une passerelle, en activant un “forward”, en lançant sur le pc :
adb forward tcp:8080 tcp:8080
Reste maintenant à lier le terminal au Selenium maître, pour cela, il faut installer l’outil flynnid sous python qui facilite la connexion (Le repo de l’outil est là https://github.com/davehunt/flynnid )
L’installation passe par pip :
pip install flynnid
et on lance
flynnid --nodeport=8080 --browsername=android --platform=ANDROID
Et voilà, nous avons un client en plus dans la console de Selenium. Il est possible d’ajouter plusieurs terminaux. J’ai ajouté un téléphone et une tablette en jouant sur le paramètre plate-forme, cela permet par la suite de spécifier sur quel terminal le test doit être passé.Bon, le client étant actif, nous lançons un tests en reprenant le code précédent et en replaçant FIREFOX par ANDROID.Et voilà, ça marche.
La suite…
Et bien, en retravaillant le script, on peut lancer le même script sur les 2 plateformes en parallèle, on teste ainsi le site sur un pc et la version mobile.
L’ajout de Selenium esclave permet la répartition des tests.
Bonus
Ci-dessous, une nouvelle version du script qui demande à Selenium de récupérer une copie écran :
from selenium import webdriver
import time
driver=webdriver.Remote('http://localhost:4444/wd/hub', webdriver.DesiredCapabilities.FIREFOX)
driver.get('http://www.google.fr')
driver.get_screenshot_as_file("firefox_screen001.png")
input=driver.find_element_by_name("q")
input.send_keys('Selenium')
btn=driver.find_element_by_name("btnG")
driver.get_screenshot_as_file("firefox_screen002.png")
btn.click()
time.sleep(1)
driver.get_screenshot_as_file("firefox_screen003.png")
time.sleep(1)
driver.close()
driver.quit()
Avec un peu de boulot, on peut avoir un script qui passe sur les 2 Selenium Firefox et Android et qui stocke les copies écran de chaque test.