 Bonjour, moi je m'appelle DemiXylos, je suis ingénieur en automation à HPE Montréal. Dans le fond, aujourd'hui je vais faire une présentation sur un outil que j'utilise dans mes temps libres et en tout petit peu au travail. Ce n'est pas le SQLX, dans le fond c'est basé sur la reconnaissance d'image et c'est un peu différent de Selenium. Bonjour. Dans le fond je suppose que vous avez compris ce que j'ai déjà dit, mais c'est dans le fond que je suis ingénieur en automation de test à Montréal. On est sur beaucoup Selenium, mais j'ai aussi un nouvel outil que j'utilise de temps en temps qui est SQLX. SQLX est assez différent de Selenium, au lieu d'être basé sur des id, d'éléments ou dans une page web. C'est plus basé sur une image ou une chaîne de texte reconnue par l'outil. Donc je vais commencer la présentation. J'utilise en quatre parties. Dans le fond, si je vais dire en premier lieu, c'est quoi ? Comment ça marche et qu'est-ce que ça peut faire pour nous ? A la fin je vais laisser un peu de temps pour les questions si jamais il y en a. Dans le fond, SQLX a été créé en 2009 par des étudiants qui finançaient le doctorat ou MIT. Dans le fond, c'était un projet d'étudiant coaché par un professeur. Par la suite, quand ils ont fini, ils ont embandé le projet en 2012 pour que la communauté le poursuive. C'est un projet open source. On peut voir le code en ligne. Dans le fond, c'est assez simple à installer. La seule chose que ça demande, c'est d'avoir un Java, Java 8.151 je pense. Il y a aussi des versions intérieures qui fonctionnent sur Java 6. Dans le fond, c'est aussi, ce que j'aime beaucoup avec ça, c'est que ça fonctionne sur différents OS. Ça fonctionne sur Mac OS, Linux, Windows évidemment aussi. Ici, c'est des exemples. C'est l'ancien SQLX. Ça fonctionne aussi, étant donné que ça reconnaît des images, ça fonctionne avec une application qui montre une image avec lesquelles on peut interagir. Ici, j'ai une application qui s'appelle Visor. Visor se permet de connecter un Android, un téléphone Android, puis interagir avec l'écran en cliquant ou en écrant des choses aux claviers. Ça permet donc d'automatiser un peu des applications Android avec cette feature-là. Dans le fond, j'aimerais aussi dire, qu'est-ce que ce n'est pas SQLX? Dans le fond, ça reconnaît les images, mais ce n'est pas un réseau de neurones. C'est beaucoup plus du pixel-match que l'image de l'apprentissage machine. Ça pourrait être intéressant en futur d'avoir l'apprentissage machine. Mais pour l'instant, ça reconnaît les pixels et ça marche assez bien si l'image ne change pas en temps réel. Dans le fond aussi, c'est en développement toujours. Parfois, il y a des bugs à gauche et à droite quand on développe l'IDA. C'est un outil qui parfois a des bugs et ça peut être frustrant parfois, mais quand ça exécute, ça exute assez bien en général, quand c'est bien configuré. Quand je dis que l'image reconnaît les images, si l'image change, ça peut mal fonctionner après. Par exemple, si on a un ordinateur qui a un égiant écran et que les icônes prennent beaucoup de pixels par-dessus, ça peut le reconnaître pour l'ordre du même. Mais si on change d'ordinateur qui ne reconnaissent plus les icônes, si les icônes ont changé le nombre de pixels qu'ils utilisent ou des choses comme ça. Pour ça, on peut utiliser des VM ou des consommateurs Docker. C'est ça. Dans le fond, ça roule en-dessous sur Java, mais on utilise du Python pour nos scripts. C'est du Python 2.7. Je parle rapidement là-dessus. C'est juste que ça prend un screenshot, ça détecte l'image à interager avec et après, ça clique ou ça écrit aux claviers. Ça fait pas mal ce qu'on veut sur le point de vue qu'est-ce qu'on peut faire avec un clavier et une souris. Dans le fond, je fais un petit exemple par rapport à comment ça fonctionne le outil. Excusez. Je vais ouvrir l'outil. Dans le fond, on voit une idée. Ça vient pas mal avec l'outil. C'est aussi possible de faire le bindé à PyCharm ou une autre idée. Dans le fond, ça, c'est pas normal. Laissez-moi se réouvrir mon code. Parfait. Je fais un démo live. J'ai un vidéo aussi d'une éduction. Dans le fond, je vais vous montrer ce code-là. Ça fait juste d'interager avec PyCharm, mais ça va donner une bonne idée de ce qu'est le cas de faire et comment ça marche entre réel et tout. Dans le fond, j'ai un code ici. On ne veut pas lire assez bien un point instant, mais je vais l'ouvrir avec une... C'est quoi ça? Excusez. Dans le fond, ici, j'ai du code. C'est assez simple. Ce que ça va faire, c'est que dans une boucle infinie, ça va attendre une seconde. Ça va cliquer sa couleur noire de peintre. Ça va cliquer sur l'étoile. Ça va draguer le curseur jusqu'au mot Montréal qui va reconnaître avec l'OCR. L'OCR, c'est Optical Character Recognition. Quand il va reconnaître Montréal, il va décliquer. Après, il va faire Control-Z avec la ligne ici. Par la suite, il va chercher un Patagon et lire les mots qui sont à droite et les afficher dans un console. Par la suite, il va chercher pour un checkbox RAN qui va ensuite cliquer sur chaque checkbox RAN qui reconnaît. Ça surveille à peu près beaucoup des features que je clique off, mais ça en a beaucoup d'autres. On peut aussi changer les paramètres facilement. Ça fait juste donner une bonne idée comment ça fonctionne. Il faut voir la distance avec Selenium ou d'autres outils d'automation de UI. Je vais lancer le script. Je vais juste ouvrir peintre avant parce que si il n'est pas ouvert, il ne va pas le voir. Je vais lancer mon script. J'espère que ça va fonctionner. Là, il clique sur la couleur noire. Il clique sur l'étoile rouge. Il draguera jusqu'à Montréal. Il reconnaît les icônes. Il y clique dessus. Je ne sais pas si vous arrivez à voir. C'est un peu petit. On va prendre un plus gros curseur, mais il clique sur chacun des logos de checkbox. C'est pratique à automatiser des tâches qui sont assez recursives dans ce sens-là. J'ai aussi une vidéo de... Là, il le fait en loop. J'essaie de l'interrompre. Parfait. C'est bon. Dans le fond, on fait voir dans la console qui reconnaît le mot Montréal. Ce n'est pas un mot que j'ai prédéfiné avant. Le Montréal ici n'est pas reconnu dans le printf. Il est capable de lire du texte dans l'écran. Ça, c'est génial. Si, par exemple, on veut automatiser une tâche qui cherche un mot dans l'écran, il peut y avoir sa bouillon au cliquet-dessus ou à côté. Ça nous permet d'avoir cette capacité. Parfois, les mots changent. Ça peut lire du texte, mais ça ne peut pas lire les captures. Ça peut être... Dans le fond, pour savoir comment ça marche, je vais montrer comment ça fonctionne avec une image. Si je clique sur l'image, c'est une image que j'ai sexée moi-même. C'est une nouvelle image à la place. Je prends à la place l'étoile verte ou l'étoile jaune à la place. C'est tout simple. Je supprime l'image. Je clique sur take screenshot. Je sélectionne l'étoile. Je prends la verte à la place. Dans le fond, il peut reconnaître les formes, mais il ne reconnaît pas les couleurs. Il y a une fonction qui permet de reconnaître les couleurs si on veut vraiment savoir ce sont les informations RGB d'un pixel. Si je clique sur l'image que j'ai pris, je peux lui demander de cliquer à côté si je veux, dans le fond, avec machine preview. Il va essayer de reconnaître une image. Si elle ne reconnaît pas à 100%, il va cliquer sur celle qui est le plus proche d'une image chercher. Donc, moi, un pixel qui change sur notre écran, ça va toujours fonctionner. On va tous les étoiles qui reconnaissent, mais si on augmente le seuil de reconnaissance, de moins en moins, il va reconnaître les étoiles autour. Par contre, même à 100%, il n'y a pas les distances de couleur. Ça, c'est une limitation. Si on a plusieurs qu'on veut cliquer, il y en a plusieurs. On y va paraître. Si je diminue encore plus en plus, il va reconnaître l'étoile un peu partout. Mais il n'y a pas d'étoiles. C'est vraiment l'algorithme de recognition qui essaie d'en voir à des endroits qu'il n'y en a pas. Dans le fond, on veut reconnaître une image, mais on ne veut pas cliquer par-dessus. On veut cliquer sur à côté. Par exemple, si il y a un checkbox à côté, on veut cliquer sur le checkbox à côté. Donc on peut, par exemple, changer le... Bien sûr, quand il reconnaît plusieurs, il clique sur celui qui match le mieux. Sinon, target offset, c'est mettons à la place de cliquer sur l'étoile verte. Je vais reconnaître où est-ce qu'elle est. Depuis sa position, je vais cliquer en bas. Alors avec les coordonnées y qui changent. Donc mettons que je sauvegarde ça. J'applique. Je relance mon code. Et ça devrait me marcher. Il est parfait. Il clique dessus, il va me réaller. Super. Donc ça fait un petit démo. Au moins, ça montre comment ça marche un petit peu, l'organisation d'image. Les mots sont reconnus par un OCR. Dans le fond, je continue ma présentation. Dans le fond, ça peut reconnaître plusieurs choses. Ça peut reconnaître des patterns, des strings, des matchs, des régions et des locations. Par ça, je veux dire, un pattern, c'est plus une image. Je vais cliquer sur l'icône de computer. Je peux carrément mettre l'image dans mon code Python pour qu'il voit le computer et clique dessus. Je peux aussi écrire computer. Il va cliquer sur computer. C'est sûr que s'il écrit bizarrement, il ne va pas le reconnaître. S'il y a des couleurs bizarres, ça peut ne pas le reconnaître. L'idéal, c'est vraiment du noir sur blanc. On peut inverser des couleurs de l'écran. Ça peut aider parfois. On peut aussi prendre des matchs de l'écran de computer par avant. Il y a aussi des régions on peut les prendre parmi des régions prédéfinies. Je vais en prendre un peu tantôt. Il y a aussi des locations un peu des coordonnées et des pixels sur l'écran. Mais ce n'est pas super, il y a beaucoup d'autotik. Il y a beaucoup d'autotik qui peut utiliser aussi ça les coordonnées et les pixels. Donc ce n'est pas un grand avantage, mais ça me permet aussi de faire ça. L'autre chose, ça reconnaît les strings. Dans le fond, on peut les reconnaître par l'image. On peut les reconnaître et les reconnaître. Mais qu'est-ce qu'ils font avec cet outil-là? C'est qu'il y a un OCR à l'intérieur. L'OCR, ça peut reconnaître le texte qui est là. Quand il reconnaît, il va avoir sa position et il va y interagir avec. Dans le fond, un OCR, ça apprend une image d'un texte et ça crée un fichier de texte un peu avec. Ça reconnaît les characters à l'intérieur. Dans le fond, on peut aussi utiliser des régions. Parfois, on veut automatiser dans une fenêtre et on ne veut pas qu'il y ait un programme dans le même ordinateur. Il y a les mêmes boutons et qu'on interagit avec à la place. Donc on peut prédéfinir des régions dans lesquelles on va automatiser. Par exemple, quand on veut automatiser avec Visor une application cellulaire, on peut définir la région qui est dans la fenêtre de Visor qui nous permet un peu de remote dans l'écran de notre cellulaire. Et ça me permet vraiment d'être sûr qu'il ne va pas cliquer à l'extérieur sur un icône qui ressemble à un icône sur notre bureau, par exemple. On peut aussi avoir plus d'arts et moniteurs. L'image est grande, plus ça prend du temps pour le système de reconnaissance d'image de reconnaître le pattern qu'on cherche. On peut avoir des inputs aussi. Il y a beaucoup de choix qui viennent avec l'outil. On peut aussi automatiser tout ce qu'il y a un keyboard que l'on peut faire. Il y a des touches spéciales qu'on peut dire key, point, backspace, délit, toutes les touches sont en clavier standard. Donc ça c'est le fun pour copier, coller ou avoir les shortcuts Windows. Évidemment aussi, qu'est-ce qu'une souris peut faire. La wheel sur une souris, bouton droit, bouton gauche. Ça peut être automatisé aussi. Donc ça c'est génial aussi. Quelque chose d'intéressant aussi que j'ai trouvé, c'est vraiment le mettre dans le docker. Je ne sais pas s'il y en a ici qui connaissent le docker. Oui, super. Dans le fond, le docker, pour ceux qui ne savent pas trop c'est quoi, je simplifie ça un peu à un VM. Ce n'est pas un VM, mais ça permet qu'on continue, qu'ils sont virtualisés. Ici, j'ai fait un exemple, c'est en tout petit, donc ce n'est pas nécessaire de lire très bien, mais j'ai juste lancé quatre conteneurs dockers avec lesquels j'ai mis un UI de Ubuntu à l'intérieur. J'ai lancé l'outil étant donné que ça marche sur Ubuntu, Linux et Mac. Excuse-moi, Linux, Mac et Windows. Je peux prendre la version ou Ubuntu et la rouler depuis un conteneur qui a Ubuntu à l'intérieur. J'ai remote desktop avec nos MVNCs dans mes quatre conteneurs. Avec un seul ordinateur, je pense que c'est 8 GB de RAM 4 CPU, je peux faire des tests depuis un conteneur. Ça, c'est cool parce que l'écran est toujours pareil, il n'y aura pas des variations entre ordinateurs, ça roule un conteneur ça va toujours avoir la même résolution le même rendering, alors les tests peuvent fonctionner d'un ordinateur à l'autre. Et aussi, c'est super parce que pour les plusieurs tests en même temps, son ordinateur avec un seul écran il y a un test à la fois et on ne pourrait pas faire de la chose en même temps, donc c'est limitant. Avec un conteneur, c'est intéressant si on veut en rouler plusieurs à la fois ou d'autres applications ou on veut que ce soit plus stable ou fiable. Dans le fond, on peut rouler ça dans une VM aussi. C'est ça que je veux dire. Dans le fond, ça fait le tour rapidement avec ce que je veux dire. Je ne sais pas si vous avez des questions. Oui, dans le fond, on peut les importe. La question c'est si on précie un autre OCR dans le fond, ça utilise Tesseract par défaut. Oui, c'est possible. Dans le fond, s'il faut importer l'alberie, j'ai jamais fait. J'ai lu un peu là-dessus, mais je sais que c'est possible. J'ai déjà cherché à le faire. En fait, je pense, étant là que c'est avec Paytons, on peut importer l'outil qu'on veut et avoir les outils de Paytons réguliers. C'est ça qui est super. On a toute la force de Paytons dans l'outil. Merci. Est-ce que vous avez d'autres questions ? Je n'ai pas. Parfois, les gens m'ont demandé qu'est-ce qu'on peut faire avec ça ? Ah oui. Est-ce que c'est possible de passer les gruits et le faire juste scripting ? Dans le fond, passer des images prédéfinies ? Oui. Oui, mais juste appeler les images. Soit tu peux mettre dans un path, soit tu peux mettre dans un fichier à côté. Quand on mange, on peut voir comment ça marche en dessous. C'est une bonne question. Dans le fond, j'ai ouvert mon script, j'ai vu comment il est fait. Dans le fond, ici, on voit ce script que j'ai fait. Excusez. Il va les nommer comme j'ai nommé. J'ai ouvert le script avec un textbox. Excusez. Donc dans le script, j'ai pas non pas le plus plus. Dans le fond, on voit le wild. Il va cliquer sur le PNG ici, qu'il y ait une image qui aura son numéro. Il fait juste appeler, je pourrais mettre ça dans mon test, carrément qui va appeler l'image, la façon que je les ai nommé. Donc on peut aussi avoir un fichier qui contient tout, et importez le fichier et comment ils appelaient une à une. Donc les images ne vont pas prendre tout l'espace de notre script, ça va être beaucoup plus pratique à long terme. Sauf que c'est vraiment le fun de pouvoir voir les images, parce que les gens, c'est vraiment visuel. C'est pourquoi tu veux cliquer quand il y a un bug. D'habitude, tu le vois, qu'est-ce qu'il reconnaît pas. C'est ça. Il y a une slide que je trouvais pas, mais je pense que je m'en appelle. Dans le fond, parfois, on se demande si on peut utiliser ça de toute façon. On peut avoir des shortcuts sur notre keyboard, mettons, on pèse sur control f1 et ça va cliquer tout de suite sur commencer un script. Ça peut être mis sur un scheduler aussi, si on veut que nos tâches se lancent périodiquement. Ça peut aussi attendre et essayer de reconnaître un événement sur l'écran. Et quand ça la reconnaît, ça peut lancer des commandes, c'est vraiment le fun. Sur ce côté-là, c'est assez vraiment flexible. Ça fonctionne vraiment avec les images. Je vais cliquer sur un application qui est dans un web browser. Je peux y cliquer dessus. Après, je peux aller dans la ligne de commande. Je peux après aller dans une chelle d'un PowerShell. Ça saute dans l'autre. Ça c'est le fun. Ça s'est versé avec l'outil. Ça ne demande pas beaucoup d'expérience. C'est pour ça que je trouve que c'est le fun à partager avec vous. Oui, deux questions. Automatiser les variations sur les scripts. J'aurais appliqué à côté ou appliqué. Il peut faire un programme, il attache le debugger et il sauvegarde les exceptions avec le script. Il peut sauvegarder des logs du script. Une façon que j'utilise, c'est quand même la question, c'est ici on peut sauvegarder les exceptions. Tu as déjà créé des variations du script pour un petit truc. Ah oui. Dans le fond, tu peux toujours automatiser un script qui automatise SQLX dans une VM parce que ça reconnaît l'image. Mais c'est... Pourquoi pas, on est aventurier. Ça pourrait fonctionner. Attaché un debugger. Étant donné que ça roule sur Python, je pense que oui, mais je n'ai jamais fait. Mais comment ça me fait penser à un autre point que j'avais. C'est la slide que je ne trouve plus. Il y avait aussi une autre chose que je voulais dire dessus. Moi, comment j'utilise, c'est aussi j'utilise pour les tests. C'est le fun parce qu'on peut les loguer. J'ai fait un petit script Python qui ne crée pas avec du JavaScript HTML. Comme ça, je vois mon log à la fin de mon test. Je peux faire des screenshots dedans pour sauvegarder, comme dans un protocolis script Python en général. Je l'ai ici. Ça, c'est un des scripts SQLX que j'ai fait, mais c'est juste du Python, donc ce n'est pas SQLX. Mais c'est pareil à la fin d'avoir invité qui contient toutes mes variables et mes résultats de tests. Des photos, moi-même, à la fonction comme ça, je fais le contenu de Darker, donc c'est vraiment le fun de pouvoir voir ça. C'est juste un exemple. C'est superbe. Est-ce que ça répond à la question ? Oui, vas-y. Vu qu'un niveau, comme de matching, que tu te montrais, est-ce qu'on ferait, par exemple, utiliser ça pour lire ou interpréter un panneau de contrôle de la snapshot d'une caméra qui parle des actions, que ça soit la nuit, un jour ? Oui. Par exemple, si jamais tu vois un visage, il faudrait qu'il ressemble vraiment beaucoup. Ce n'est vraiment pas un machine l'unique, donc parfois, il ne va pas reconnaître des patterns fréquents, mais mettons que tu vas un Corel apparaître, ou mettons un logo de warning, battery low. Il peut reconnaître le logo facilement parce que c'est du 2D. Mais le 3D en général, c'est difficile parce qu'il se change facilement et c'est difficile à reconnaître. Je ne sais pas si ça va pas. Super. Est-ce qu'il y avait une autre question dans le fond ? Oui. J'avais 4 instances. 4 containers en même temps. Oui, je peux développer dans le VNC, puis comment je peux fermer après, puis ça roule. Je peux sauvegarder. C'est pas mal d'avoir autant d'instances que je veux. Autant d'instances que mon ordinateur peut me permettre. C'est ça qui est génial, c'est qu'on peut en faire plus en même temps. Souvent, un des facteurs limitants que les gens trouvent avec ce client, c'est que je peux changer. Si notre Firefox fait un nouveau logo, ça ne reconnait plus. Des choses qui arrivent, c'est dans un conteneur, c'est toujours la même version de Firefox. Ça roule à chaque fois. C'est de la même façon. C'est ça qui est cool. Super. Est-ce qu'il y avait d'autres questions ? Il me reste encore 5 minutes. Oui, vas-y. Est-ce qu'il peut avoir un départ en ce temps ? Oui. Si l'image change à chaque fois, on peut faire une condition if. Si jamais c'est cette image qui est reconnue d'aller dans ce sens-là, c'est plus comme ça. Ça s'appelle Exist, la fonction dans SQLX. Ça permet de... Quand un sens existe, ça retourne vrai. Quand ça existe pas, ça retourne faux. Sinon, il y a toujours try-catch. Jamais, il y a une fonction qui crash, mais ça n'arrive pas toujours. Si on utilise même une fonction, ça peut que ça retourne quelque chose d'autre qui est vrai ou faux. Mais c'est... pas mal ça, donc... J'espère que ça va prendre ta question. Oui, parfait, super. Oui ? J'en ai les voix, encore. Est-ce qu'il y avait d'autres questions ? Non ? Ok, bien merci beaucoup. Et ça me fait plaisir de vous présenter ça aujourd'hui.