Pour pouvoir tester l'interface utilisateur Web de bout en bout, nous utilisons Selenium et ChromeDriver pour automatiser le chargement/l'interaction des pages dans le cadre de notre pack de tests.
Cela se comporte comme prévu lors des tests réalisés par les développeurs (sur la machine locale du développeur), mais nous avons du mal à effectuer ces vérifications dans le cadre de notre processus d'intégration continue.
Notre serveur est basé sur * NIX et toute notre infrastructure CI s'exécute sur ces machines. Pour pouvoir tester Chrome sous Windows (notre mécanisme de livraison), nous avons configuré une grille Selenium. Lors de l'exécution des tests de CI, ils accèdent à la grille afin de localiser un nœud Windows sur lequel les tests doivent être exécutés.
Nous avons eu un poste de travail Windows provisionné uniquement dans le but d’exécuter ces tests. Celui-ci contient notre version d'entreprise standard de Windows 7. Cette machine sera périodiquement redémarrée conformément à la stratégie de mise à jour du service informatique.
Afin de nous assurer que le serveur Selenium est toujours en cours d'exécution, nous avons ajouté le serveur Selenium (fonctionnant en mode "nœud") en tant que service Windows. Le serveur Selenium est configuré pour démarrer ChromeDriver afin d'appeler l'interaction utilisateur simulée.
Cependant, lors de l'exécution des tests à partir de CI, ils échouent en raison d'un délai d'expiration. Selon notre théorie de travail, l'utilisateur du système qui exécute le service ne peut pas créer de fenêtres interactives. Une recherche sur le Web a fait référence au problème de la "session 0", mais avec peu ou pas de conseils constructifs sur la manière d'aller de l'avant.
Démarrer manuellement le processus du serveur Selenium à partir d'une session interactive n'est pas une solution viable, car cela conduit à des tests fragiles, qui échouent en raison d'un problème d'infrastructure plutôt que d'une véritable régression de test.
Comment peut-on lancer une instance de Selenium Server via un service Windows à chaque redémarrage du système, capable de lancer des instances de Chrome?
Cela pourrait être facilement fait avec NSSM . L'installation des services ressemble à ceci:
nssm install seleniumhub Java -jar C:\Selenium\selenium-server-standalone-2.45.0.jar -role hub -hubConfig C:\Selenium\hub.json
nssm install seleniumnode Java -jar C:\Selenium\selenium-server-standalone-2.45.0.jar -role node -nodeConfig C:\Selenium\node.json
Il fournit facilement un moyen de supprimer le service si nécessaire:
nssm remove seleniumnode confirm
Ajoutez la destination à nssm à votre variable PATH et exécutez la console en tant qu'administrateur
Pour le moment, vous ne pouvez pas vous en empêcher - cela fonctionnait bien dans la session 0, mais ces derniers jours, la mise à jour de Chrome ne fonctionne que pour les sessions interactives.
Bugs liés:
https://code.google.com/p/Selenium/issues/detail?id=8029https://code.google.com/p/chromium/issues/detail?id= 422218
Vous ne pouvez pas exécuter Selenium Grid en tant que service Windows depuis Windows Vista. Microsoft appelle cela "Session 0 Isolation". Vous pouvez le faire dans Windows 2000 ou XP, mais depuis la sortie de Vista, Microsoft ne laissera plus Grid interagir avec le bureau (ni avec aucun autre programme d’interface utilisateur). Indépendamment du fait que vous voyez toujours la case à cocher "interagir avec le bureau", il s’agit d’un faux pas. Donc, vous DEVEZ exécuter Selenium Grid au premier plan sur ce serveur pour que celui-ci puisse accéder à la session. S'il exécute Windows Server, vous pouvez théoriquement avoir plusieurs sessions et laisser Grid s'exécuter au premier plan sur l'une des sessions utilisateur autres que zéro.
Ma solution préférée à ce problème (et mon choix par défaut pour exécuter Selenium Grid en tant que service) consiste à utiliser un outil simple appelé AlwaysUp. Il dispose d'un essai gratuit de 30 jours pour l'essayer.
Que faire:
De cette façon, le nœud sera exécuté en tant que service, survivra au redémarrage de la machine et fonctionnera avec la dernière version de Chrome.
Si le compte d'utilisateur que vous utilisez pour vous connecter à la machine est différent du compte d'utilisateur que vous spécifiez pour exécuter le nœud en tant que service, les navigateurs ne s'affichent pas sur le bureau car ils s'exécutent dans une session d'utilisateur différente. Le résultat final est qu'il est presque identique à fonctionner en tant que service normal mais contourne le problème Session 0 .
Oui, vous devriez utiliser NSSM. L'important est que vous ajoutiez votre compte Windows dans l'onglet "Connexion" ou tout autre compte valide. Si vous exécutez votre noeud avec l'option "Compte système local", vous rencontrerez le problème de la session 0. Avec une session utilisateur normale, les nœuds sont parfaitement invisibles en arrière-plan :)
nous n'utilisons pas Selenium GRID, nous avons été déçus par sa stabilité. Nous utilisons une "grille Jenkins", c’est-à-dire des nœuds esclaves jenkins sur différents serveurs.
Les esclaves sont des services avec l'indicateur d'interaction avec le bureau. Ils s'exécutent en tant que services avec NSSM et avec l'indicateur SERVICE_INTERACTIVE_PROCESS. Assurez-vous que NoInteractiveProcess est défini sur 1 (cf https://docs.Microsoft.com/en-us/windows/desktop/services/interactive-services ).
Nous ne disposons pas des fonctionnalités de fantaisie de la grille (c'est-à-dire l'équilibrage en fonction des types de navigateur). Au lieu de cela, nous avons demandé à Jenkins d'équilibrer les travaux de test en utilisant un nœud esclave ou un autre . Au départ, nous n'avions pas utilisé l'indicateur d'interaction avec le bureau. redimensionner les commandes) . Espérons que cela aide.