Automatiser des actions avec selenium, pyautogui et xvfb

Rédigé par Fred - - Aucun commentaire

On 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()

Écrire un commentaire

Quelle est la troisième lettre du mot fprpw ?