Training #3 – AutoMate

Ca fait un bout de temps que je n’ai pas écrit sur ce blog. Confinement et travail ont été les maitres mots de ces quelques mois. Et puis je n’avais pas vraiment de sujets à vous présenter.

Cependant, me voilà, et j’ai un gros sujet à vous présenter. Un projet perso que je réalise et qui, arrivé là où il en est, est fonctionnel.

Son petit nom : AutoMate.

Présentation

Au quotidien, j’utilise un outils et je développe des scenarios qui sont utilisés pour effectuer des actions utilisateurs à répétitions. Cela permet de traiter un grand nombre de données sans utiliser du temps humain (qui peut être utilisé sur d’autres tâches).

Aujourd’hui, le temps de développement sur cet outils est conséquent et prend un certains nombres d’heure afin d’arriver à quelque chose d’abouti. Je me suis donc inspiré d’une partie de mon travail, pour imaginer une solution qui sera sensiblement la même, mais avec un développement plus rapide des scénarios. Des solutions pour cela existent déjà ; Contextor par exemple, pour faire du RPA. Mais j’avais besoin d’autre chose. M’est venu l’idée d’utiliser les fichiers YAML.

Ainsi est né AutoMate, la librairie qui permet de développer des automates avec des fichiers YAML.

Fonctionnement

Je ne vais pas expliquer ici comment cela fonctionne, surtout que certaines choses vont être ammenées à changer. Mais pour les curieux, le code est disponible sur GitHub à l’adresse https://github.com/JuGid/AutoMate

Utilisation

Pour utiliser AutoMate, il vous faudra créer quelques dossiers et surtout avoir >PHP 7. Cet exemple est disponible sur le GitHub du projet : https://github.com/JuGid/AutoMate/tree/master/example

Créez un fichier de configuration en YAML, par exemple config-perso.yaml

automate:
	browser:
		default: chrome
	drivers:
		chrome:
			driver : 'C:/Moi/MonProjet/MesDrivers/chromedriver'
		firefox:
			driver: 'C:/Moi/MonProjet/MesDrivers/gueckodriver'
	scenario:
		folder: 'C:/Moi/MonProjet/scenario'
        specs:
                folder: 'C:/Moi/MonProjet/specs
	logs:
		enable: true
		folder: 'C:/Moi/MonProjet/logs'

Ce fichier de configuration permet a AutoMate de savoir où sont stockés les Webdrivers, les scenarios et les logs.

  • Il faut définir le navigateur par défaut et fournir au moins un WebDriver qui correspond au navigateur par défaut
  • Un scenario est un enchainements de commandes envoyées au Navigateur automatisé. C’est la coeur de AutoMate.
  • Les specs (specifications) sont des fichiers CSV qui regroupent l’ensemble des données à traiter (nous verrons comment après)
  • Les logs sont les rapports de WINS et d’ERRORS lorsque l’on utilise une spec (exclusivement). Il est possible de les désactiver avec l’option ‘enable’

Les scenarios

Voici un exemple de scenario très simple :

/scenario/creer-cookie.yaml

browser: chrome
variables:
    name: 'bonjour'
    cookie: 'nouveau'
scenario:
    steps:
        - go: 'http://youtube.Fr'
	- cookie:
	    name: "monCookie"
	    value: "maValeur"

Ce fichier est facilement compréhensible : on voit que le scenario est d’aller sur http://youtube.Fr et de créer un cookie du nom de ‘monCookie’ et de valeur ‘maValeur’.

Maintenant je vais modifier le fichier pour que vous compreniez la partie ‘variables’ du fichier.

browser: chrome
variables:
    name: 'bonjour'
    cookie: 'nouveau'
scenario:
    steps:
        - go: 'http://youtube.Fr'
	- cookie:
	    name: "{{ scenario.name }}"
	    value: "{{ scenario.cookie }}"

Maintenant, j’utilise les variables du périmètre ‘scenario’, c’est a dire, les variables définies dans celui-ci, dans la section ‘variables’.

L’élément ‘browser’ permet de définir un navigateur à utiliser pour ce scenario. Il prend la priorité sur le navigateur défini dans la configuration et dans la fonction run() que nous verrons ensuite.

Les différents périmètres de variables
  • Périmètre ‘scenario‘ : récupère les variables définies dans le fichier de scenario
  • Périmètre ‘spec‘ : récupère les variables définies dans le fichier de specification
  • Périmètre ‘global‘ : lors de l’utilisation de la commande ‘get’, vous cherchez à récupérer une valeur. Cette valeur est stockée dans ce périmètre.

Les specifications

Les spécifications sont de simples fichiers CSV de cette forme :

url,cookiename
http://youtube.fr,youtube
http://google.fr,google
http://github.com,github

La première ligne est obligatoire et permet de définir le nom des variables que prendront les valeurs des lignes suivantes.

Les spécifications doivent être déposées dans le dossier /specs/creer-cookie avec un nom quelconque, ou dans le dossier /specs avec pour nom creer-cookie.csv.

Lorsque la specification est utilisée lors d’un scenario et que ce scenario se termine. La spec est renommée en ‘creer-cookie_PROCESSED.csv’. Cette specification marquée PROCESSED ne sera plus prise en compte. Si le scenario est lancé en test mode, ce renommage ne s’opère pas.

$scenarioRunner->enableTestMode()

Une fois lancé, le scenario récupère les données de specification pour les charger dans le périmètre ‘spec’ des variables. Ainsi, il est possible de faire un scenario du type :

browser: chrome
variables:
    name: 'bonjour'
scenario:
    steps:
        - go: "{{ spec.url }}"
	- cookie:
	    name: "{{ scenario.name }}"
	    value: "{{ spec.cookiename }}"

Et le scenario va être répété autant de fois qu’il y a de lignes dans la spec en remplaçant les variables.

Les logs

Les logs sont générés lors du passage du scenario. Au lancement, deux fichiers sont créés dans le dossier /logs/creer-cookie. Un fichier LOGS_WINS et un fichier LOGS_ERRORS. Ils répertorient les passages bons et mauvais du scenario. Les LOGS_ERRORS permettent de voir le message d’erreur qui a causé la fin du scenario.

Il est possible de définir les colonnes a insérer dans les logs :

$scenarioRunner->setColumnsToLog(['url']);

Les autres colonnes ne seront pas insérées.

Le lanceur

Votre fichier de lancement minimum (exemple : app.php ) doit ressembler à cela :

#!/usr/bin/env php
<?php

require __DIR__.'/vendor/autoload.php';

use Automate\Scenario\ScenarioRunner;

$scenarioRunner = new ScenarioRunner();
$scenarioRunner->setConfigurationFile('/config/config-perso.yaml');
// $scenarioRunner->enableTestMode();
// $scenarioRunner->setColumnsToLog(['url']);
$scenarioRunner->run('creer-cookie', true);

Il vous faut créer un nouvel objet ScenarioRunner et de lui fournir un fichier de configuration valide (comme créé au début de cet article) puis d’y ajouter quelques informations comme le mode de test ou les colonnes à inscrire dans les logs.

La fonction run a cette signature :

/**
   * Run the scenario.
   * If you set $with_spec and did not use ScenarioRunner::setSpecification
   * please watch SpecificationFinder::find documentation
   * @param string $scenario_name The scenario name. It corresponds to the yaml file name in scenario folder specified in config file.
   * @param bool $with_spec Specify if you want to run the scenario with a spec
   * @param string|null $on_browser You can specify a browser. If not, the default browser in scenario or config file is taken.
   * @return void
   * 
   * @see Automate\Scenario\Scenario::getScenarioBrowser()
   */
  public function run(string $scenario_name, bool $with_spec = false, string $on_browser = null) : void

Il est donc possible de fournir un navigateur dans la fonction run ou de choisir de lancer le scenario sans specification (pour les one shot par exemple).

Priorité du choix du navigateur

Afin de choisir le navigateur sur lequel lancer les scenarios, une priorité a du être choisie pour faire un choix. Cette priorité est la suivant :

scenario > fonction run > configuration

Rendu visuel

Voici le rendu visuel après lancement du scenario via php app.php :

A venir

Il y a quelques fonctionnalités à venir :

  • Une interface de gestion des scenarios, de la configuration et pour la lecture des logs
  • Des tests unitaires pour verifier que tout fonctionne bien
  • Une command (symfony/console) pour le lancement facilité des scenarios
  • La séparation de la commande ‘wuntil’ pour faciliter la lecture
  • Remplir le wiki des informations nécessaires (et en anglais)
  • Pleins d’autres choses

J’espère que ce projet en cours pourra vous aider en cas de besoins. Pourquoi pas pour réaliser des tests ou faire de l’intégration répétitive de données.

Ou si ce projet vous inspire pour d’autres choses… N’hésitez pas à commenter ou a me le faire savoir.

A bientôt !

Laisser un commentaire