IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques tierces Python Discussion :

Automatisation : intéragir avec une GUI tierce


Sujet :

Bibliothèques tierces Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire
    Inscrit en
    Octobre 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien de laboratoire

    Informations forums :
    Inscription : Octobre 2022
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Automatisation : intéragir avec une GUI tierce
    Bonjour,

    Je suis débutant en python, j'apprends en autodidacte. Je travaille principalement sur des mini-projets d'automatisation de tâches répétitives dans le cadre de mon travail, pour me faciliter la vie (et celle des collègues qui seront peut-être intéressés par mes petits scripts ^^).

    Pour le moment, je n'ai codé que des choses assez simples, à base de scraping de site web mal conçus, avec login/mdp puis automatisation de clics, remise en forme des résultats, etc. Pour info, avec des outils comme Beautifulsoup.

    Là, j'aimerai me frotter à des problèmes bien plus épineux, et automatiser des interactions avec un logiciel métier, sur lequel je ne peux pas capter directement des requêtes/réponses, puisqu'il est exécuté sur une sorte de machine virtuelle (citrix pour ceux qui connaissent).
    La seule solution qui s'offre à moi, je pense, c'est d'écrire un programme qui analyse ce qui s'affiche à l'écran, qui reconnait certaines zones (les boutons, cases à cocher, champs de texte...), et simule un clic de souris sur la zone en question, et pareil pour les entrées de clavier.

    Je voudrais avoir votre avis sur cette approche, sa faisabilité, et sur quelles bibliothèques je pourrais utiliser pour faire cela.

    Merci d'avance pour vos lumières !

    PS : Je voudrais préciser que pour faire tout cela, j'ai bien entendu demandé le feu vert à ma hiérarchie, et tout va bien.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonsoir,

    pour avoir déjà été confronté au problème avec un logiciel exécutable qui ne disposait qu'aucun moyenne de s'interfacer par ligne de commande/socket ou autre.
    La solution trouvée était d'utiliser la reconnaissance de caractère (OCR) pour extraire le texte dans certaines zones.
    Dans mon cas je n'avais pas à interagir mais simplement monitorer des chiffres mais je sais qu'il existe la librairie PyAutoGUI qui permet de contrôler des actions clavier/souris assez simplement, mais tout le défi est d'abord de savoir où regarder et comprendre ce qu'on voit à l'interface.

    La première étape consiste à réaliser la capture d'écran du logiciel.
    La lib Pillow (inclus dans WinPthon) permet de faire ça très facilement.

    Exemple trouvé ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from PIL import ImageGrab
    bbox = (300, 300, 550, 550)
    im = ImageGrab.grab(bbox)
    im.save('screenshot.png')
    Il est possible d'indiquer une zone de capture déterminée dans l'écran ce qui peut faciliter l'extraction dans le logiciel plutôt que de devoir recherche une zone.
    De plus la fenêtre du logiciel est susceptible d’être déplacée du coup il est possible de venir retrouver la position et la taille de la fenêtre, pour cela j'ai utilisé win32api qui permet de connaître les coordonnées d'une fenêtre à partir du nom, mais il existe peut-être une lib qui permet de tout faire en même temps en indiquant juste le nom de la fenêtre à capturer.

    Dans mon cas le logiciel tournait en local mais dans le votre qui se trouve dans une VM en connexion bureau à distance je suppose il faudra probablement recadrer.

    donc ensuite on se retrouve avec des petits bouts de capture d'écran de certaines zones et il faut venir faire une reconnaissance des caractères.

    J'ai utilisé pytesseract qui utilise le logiciel gratuit Tesseract-OCR réalisé par Google, qui tourne en local je tiens à préciser.

    L'installation n'est pas compliqué et l'usage est d'une grande simplicité :

    Exemple tiré du Quickstart :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from PIL import Image
     
    import pytesseract
     
    # If you don't have tesseract executable in your PATH, include the following:
    pytesseract.pytesseract.tesseract_cmd = r'<full_path_to_your_tesseract_executable>'
    # Example tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract'
     
    # Simple image to string
    print(pytesseract.image_to_string(Image.open('test.png')))
    Disons que ça fonctionne très bien sur du texte très contrasté (comme l'exemple fourni ici) et avec une bonne résolution mais sur du petit texte d'une IHM bruité par du lissage de texte coloré comme le fait le ClearType c'est beaucoup moins évident.
    Il faut au préalable appliquer du filtrage détourage et agrandissement de l'image pour permettre une distinction des contours du texte, autrement ça va produire des erreurs à la reconnaissance des caractères.

    La documentation que j'ai lu au sujet des OCR en général est qu'il vaut mieux entraîner le moteur à reconnaître le texte/la police d'écriture qu'on souhaite lui faire deviner ensuite, autrement il risque de produire beaucoup d'erreurs.
    Pour le traitement d'image j'avais utilisé PIL mais j'ai appris plus tard que opencv (cv2) est beaucoup plus adapté avec des filtres de détourage idéals pour la reconnaissance de caractères.



    Donc oui c'est possible, mais ça peut vite devenir compliqué.
    Il faut vraiment que ça en vaille la peine car l'investissement est long et selon la complexité de votre logiciel et des tâches à réaliser dessus ça peut facilement prendre des jours voire des semaines.

    Si vous êtes certain qu'il n'y a pas d'autre moyen de s'interfacer avec le logiciel, un greffon logiciel/plugin/patch alors l'OCR reste la dernière solution envisageable.

    Bon courage à vous

Discussions similaires

  1. Intéragir avec une application
    Par masseur dans le forum C#
    Réponses: 4
    Dernier message: 15/06/2008, 16h36
  2. Problème avec une GUI contenant un waitbar et une image
    Par AsmaHaj dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 05/05/2007, 00h06
  3. communiquer avec une app tierce depuis java
    Par azzhunter dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 24/03/2007, 10h32
  4. [D6] Problème avec une DCU tierce
    Par dridri86 dans le forum Delphi
    Réponses: 6
    Dernier message: 06/02/2007, 11h45
  5. [sockets]Comment intéragir avec une socket php ?
    Par le Daoud dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 31/10/2005, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo