Automatiser des actions avec selenium, pyautogui et xvfb
Rédigé par Fred - - Aucun commentaireOn a parfois besoin de faire des tâches répétitives nécessitant de remplir toujours les mêmes champs, cliquer toujours aux mêmes endroits… Pour automatiser ces actions dans un navigateur, il existe selenium. On peut ainsi naviguer vers une page, récupérer des éléments via xpath, id, nom… puis agir dessus : envoyer des touches, appuyer sur des boutons, etc.
De plus, on peut lancer les scripts dans des serveurs X virtuels comme Xvfb : l’affichage n’est vas visible à l’écran et on peut ainsi utiliser crontab pour lancer les scripts même lorsque notre session est fermée.
Ça ne marche par contre pas quand il y a du des applets java, voire
flash, ou pour bouger la souris. Pour cela il faut utiliser d’autres
outils, comme sikuli, ou encore plus simple, pyautogui. Par contre il
va falloir dire à pyautogui
que l’affichage n’est pas celui de notre
session, mais celui de xvfb. Pour cela, voir cette réponse sur
stackoverflow qui tient en une ligne :
pyautogui._pyautogui_x11._display = Xlib.display.Display( os.environ['DISPLAY'] )
Voici un exemple (pour m’en souvenir) de tout cela combiné :
import pyautogui import os import Xlib.display from time import sleep from selenium import webdriver from pyvirtualdisplay.smartdisplay import SmartDisplay # pour visible=1, installer xserver-xephyr # sinon, xfvb prend le dessus display = SmartDisplay(visible=0, size=(800, 600)) display.start() browser = webdriver.Firefox() browser.get('https://duckduckgo.com/') browser.save_screenshot('nrst.png') print browser.title search = browser.find_element_by_id('search_form_input_homepage') search.send_keys("auie") # la souris se déplace dans le SmartDisplay pyautogui._pyautogui_x11._display = Xlib.display.Display( os.environ['DISPLAY']) try: x, y = pyautogui.locateCenterOnScreen('loupe.png') pyautogui.moveTo(x, y, 0.5, pyautogui.easeOutQuad) pyautogui.click() except: print "pas trouvé de loupe!" sleep(3) browser.save_screenshot('auie.png') browser.quit() display.stop()