Selenium

Selenium jpp

Deux petits articles consacrée à Selenium

 

Le logo de Selenium

Non ce n'est pas un métal !  C'est un ensemble de logiciels adaptés au test de sites WEB.

Depuis ce test (réalisé en 2017) Selenium a pas mal évolué, les IDE incorporables aux navigateurs ont aussi beaucoup évolué et pas forcément en bien ... celui que j'utilisais ne permet plus de générer des scripts Python , quel dommage ! 
Après une petite recherche j'ai trouvé un IDE "Katalon" qui est très ressemblant et facile à utiliser et qui génère du Python ! Par ailleurs Katalon propose un environnement de test que je vais regarder de près.

Peut-être un test.

Selenium : juste un petit tour.

Selenium : juste un petit tour. jpp

Cet article ne représente qu'un démarrage minimum avec ce produit dont les domaines d'applications sont très divers car il permet de tester un logiciel avec divers browser (Chrome, Firefox, Opera, Safari, Internet Explorer) sur divers systèmes d'exploitation (Linux, MacOs, diverses saveurs de Windows). 
Ici, tests faits sur un portable sous Linux, cela se réduit à l'IDE et deux browser sous Linux : Chromium (Chrome a refusé de fonctionner avec la version du driver dont je dispose) et Iceweasel (Firefox). 
Des "bindings" existent pour plusieurs langages ; Ruby, Python et bien sûr Java.Je n'ai testé ici que l'interface pour Python. Une version de Java 1.7, (JRE) convient parfaitement.

Depuis le site "seleniumhq.org" :

  • Charger le module Selenium IDE comme ADDON Mozilla (version testée 2.9.0)
  • Charger le "standalone server" (version testée 2.46)
  • Charger les drivers Python : Lancer l'installaton (en root !) : 
    pip install -U selenium
  • Chrome driver (32 bits Linux), charger la dernière version (ici la 2.16) :http://chromedriver.storage.googleapis.com/2.16/chromedriver_linux32.zip (ou linux64). Cette version est numerotée "v2.9.248316" à l'éxécution ???

J'ai ensuite installé tout ça dans un répertoire "Selenium" pour bien l'isoler. 
J'ai ajouté un répertoire "Config" et un répertoire "Tests". Le répertoire "Config" contient les deux fichiers de configuration (format json) pour le "Hub" et un pour le "Node".  
Ici je ne lance qu'un seul node et sur la même machine ( portable i386 avec 4G de mémoire très convenable pour les vacances !) Selenium fonctionne avec au moins deux processes (tout est dans la stand-alone-server) : 
Le "Hub" reçoit les demandes d'exécution et les transmet au "Node" (ou à un parmi les Nodes déclarés) qui dispose du pseudo-browsers demandés. Ici nous disposons d'un driver Firefox (standard du paquet) et d'un driver "chrome". Petite remarque : le driver "chrome" ne fonctionne pas avec les versions de "google-chrome" que j'ai testées mais parfaitement avec la version "chromium" fournie par Debian. 
J'ai aussi effectué quelques tests avec Opera mais sans succès pour le moment, pas de machine Windows dispo donc pas de tests Internet Explorer.

L'IDE Selenium est accessible dans le menu "Outils" de Firefox (ici IceWeasel) ou par le raccourci "Ctrl+Alt+s". 
L'enregistrement est facile et sans problèmes depuis Firefox, on peut le rejouer immédiatement pour vérifier.

Pour un premier test se "balader" un peu sur un site (j'ai utilisé un site local de test), valider ensuite le test et le sauvegarder en format "natif" puis le sauvegarder en format "Python" dans un fichier "xxxxxxxx.py".

Pour éxecuter un test créé par l'IDE : 
l'exporter en mode "python 2 unittest webdriver" sour le nom "test_remote.py" et lancer la commande : 
python test_remote.py 
Une fenêtre Firefox s'ouvre et le test s'y éxécute.

Pour exécuter les tests en mode "Webdriver" et lancer plusieurs tests simultanément in faut créer un "Hub" et au moins un "Node". 
Sauvegarde le test au format Python ( ici "Python2 unittest webdriver"). 
Le lancement ouvrira une fenêtre Firefox (par défaut) et on verra défiler les pages du test. Pour utiliser Chromium il suffit de modifier très légèrement le script. 
Partie du script généré pour Firefox :

class TEST03(unittest.TestCase): 
    def setUp(self): 
        self.driver = webdriver.Remote(desired_capabilities={ 
            "browserName": "firefox", 
            "platform": "LINUX", }); 
Après modification pour Chromium : 
class TEST03(unittest.TestCase): 
    def setUp(self): 
        self.driver = webdriver.Remote(desired_capabilities={ 
            "browserName": "chrome", 
            "platform": "LINUX", });

Cette méthode permet de vérifier rapidement le script. 

Deux scripts hyper simples et deux fichiers de configuration permettent de lancer le "Hub" et un "Node". Le script de lancement d'un "Node" peut être lancé sur plusieurs machines avec la modification de l'adresse du "Hub" dans son fichier de configuration.

Lors des tests j'ai remarqué une consommation CPU assez importante et mon brave portable ne peut guère supporter deux browser en concurrence (Un Chromium et un Firefox) en plus du serveur Web dans sa machine virtuelle KVM sans commencer à montrer des signes d'épuisement. Avec trois browsers le ralentissement est notable dans ce petit portable qui date de 2009 (voir l'article de présentation de cette machine SSDisée). 
 

Selenium : scripts et fichiers de paramétrage

Selenium : scripts et fichiers de paramétrage jpp

Le script de lancement du Hub :

#!/bin/bash 
OPTIONS=' -hubConfig ./Config/HubConfig.json  ' 
java -jar selenium-server-standalone-2.46.0.jar -role hub  $OPTIONS

Et son fichier de configuration :

{ 
  "host": "127.0.0.1", 
  "port": 4444, 
  "newSessionWaitTimeout": -1, 
  "servlets" : [], 
  "prioritizer": null, 
  "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher", 
  "throwOnCapabilityNotPresent": true, 
  "nodePolling": 5000, 
  "cleanUpCycle": 5000, 
  "timeout": 300000, 
  "browserTimeout": 0, 
  "maxSession": 5, 
  "jettyMaxThreads":-1 
}


Le script de lancement d'un Node :

#!/bin/bash 
PATH=./:$PATH 
export PATH 
export SELENIUM_SERVER_JAR=$(pwd) 
OPTIONS='  -nodeConfig ./Config/NodeConfig.json ' 
java -jar selenium-server.jar -role node  $OPTIONS


Et son fichier de config :

{ 
  "capabilities": 
      [ 
        { "browserName": "*firefox", 
          "maxInstances": 5, 
          "seleniumProtocol": "Selenium" 
        }, 
        { "browserName": "*googlechrome", 
          "maxInstances": 5, 
          "seleniumProtocol": "Selenium" 
        }, 
        { "browserName": "*iexplore", 
          "maxInstances": 1, 
          "seleniumProtocol": "Selenium" 
        }, 
        { "browserName": "firefox", 
          "maxInstances": 5, 
          "seleniumProtocol": "WebDriver" 
        }, 
        { "browserName": "chrome", 
          "maxInstances": 5, 
          "seleniumProtocol": "WebDriver" 
        }, 
        { "browserName": "internet explorer", 
          "maxInstances": 1, 
          "seleniumProtocol": "WebDriver" 
        } 
      ], 
  "configuration": 
  { "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", 
    "maxSession": 5, 
    "port": 5555, 
    "host": "127.0.0.1", 
    "register": true, 
    "registerCycle": 5000, 
    "hubPort": 4444, 
    "hubHost": "127.0.0.1" 
  } 
}