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.