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

Gone in Six Characters

Rédigé par Fred - - Aucun commentaire

Les raccourcisseurs d’url utilisent généralement 5-6 chiffres/lettres. Du coup c’est facile à bruteforcer, et donc, il ne faut pas partager des choses sensibles via ces raccourcisseurs ! (Ce qui n’est visiblement pas évident pour tout le monde…)

Via MeFi.

Des templates de pages web html5-css3

Rédigé par Fred - - Aucun commentaire

À chaque fois que je vois passer ce genre de lien avec des bons commentaires, je le note dans un coin. Ça me fait toujours penser à http://www.csszengarden.com/ — une même page html, juste le css qui change. Comme je suis arrivé à 10, je partage. Si vous connaissez d’autres liens, n’hésitez pas.

Lire la suite de Des templates de pages web html5-css3

Création d’un nouveau billet depuis emacs

Rédigé par Fred - - 6 commentaires

J’écris toujours mes billets sous emacs. Mais depuis que je suis passé à PluXml et jusqu’à il n’y a pas si longtemps, je devais exporter l’article (le fichier ou la sous-arborescence) en html (où plutôt dans ma version), puis copier et coller le contenu dans la partie administration du blog, en renseignant date, catégorie et mots clés (je ne me sers pas vraiment des autres options pour le moment), qui étaient ensuite transformés en fichier xml.

Quand on a eu l’habitude d’utiliser org-publish, c’est fastidieux… J’ai donc écrit quelques lignes d’elisp pour pouvoir créer directement ce fichier xml. Comme d’habitude, c’est disponible sur bitbucket.

Avec le passage à PluXml, j’en ai profité pour revoir un peu ma façon d’écrire des articles :

  • Soit je trouve quelque chose sur le net, et dans ce cas là je récupère le lien via org-protocol ;
  • Soit je veux faire un article plus conséquent, ou qui ne vient pas d’un lien, et je crée un nouveau fichier .org dans un dossier /chemin/qui/va/bien/année/mois/jour/ (avant, tous mes articles étaient sous cette forme).

J’ai maintenant un fichier dans lequel je me note plusieurs choses concernant ce site, et en particulier, j’ai l’arborescence suivante en ce qui concerne les articles que je pense faire pour ce blog :

#+TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
#+TODO: À_ÉCRIRE(à) COMMENCÉ(o) EN_ATTENTE(e@) FINI(f) | ANNULÉ(a) PUBLIÉ(p)

* Ce fichier…
* TODO [#A] Blog
** Catégories
*** diatribes
*** paremboles…
*** guides…
*** snippet…
*** lab…
*** blog…
*** projets…
*** raccourcis…
*** trouvailles…
*** memos
**** PUBLIÉ Encoder avec mencoder                             :mettre_à_jour:
**** PUBLIÉ Quelques notes SoapUI                             :mettre_à_jour:
**** PUBLIÉ Python Module of the Week                           :python:info:
Note pour moi-même.

Les modules des « module python de la semaine » : https://pymotw.com/2/contents.html

Par ordre alphabétique : https://pymotw.com/2/py-modindex.html

Pour info, pymotw est/était la présentation par Doug Hellmann d’un
module python avec des exemples de codes. Les sources sont disponibles
sur bitbucket.

Pour python 3 : https://pymotw.com/3/
**** PUBLIÉ Besoin de se dégourdir les doigts ?               :mettre_à_jour:
**** COMMENCÉ org-protocol                                    :emacs:orgmode:
*** non classé…
*** Snippets…
** Statiques…
*** Cheatsheet…
*** lab…

* TODO Site…

Sous le header Blog puis Catégories, j’ai toutes les catégories de mon blog. Et dans chaque catégorie, j’ai ensuite mes articles :

  • Soit en clair dans le fichier (ce qui est par exemple le cas pour l’article pymotw)
  • Soit un lien dans le dossier année/mois/jour (comme pour l’article Encoder avec mencoder).

Création d’un nouvel article

Pour créer un nouvel article, j’utilise un raccourci qui me demande un titre, puis crée le nom de fichier à partir de ce titre et de la date 1, le met dans le bon dossier (/chemin/qui/va/bien/aaaa/mm/jj/), et renseigne l’entête (avec quelques valeurs par défaut, configurables).

Pour cet article, voilà l’entête qui a été créé :

#+TITLE: Création d’un nouveau billet depuis emacs
#+DATE: <2016-04-10 11:09:42>
#+AUTHOR: Fred 
#+PLX_CAT: 
#+PLX_DRAFT: t
#+PLX_WAITING_VALIDATION: 
#+PLX_ALLOW_COM: 1
#+PLX_TEMPLATE: article.php
#+PLX_TAGS: 
#+PLX_META_DESCR: 
#+PLX_META_KEYWORDS: 
#+PLX_ARTICLE_ID: 0053

Je peux ainsi renseigner la catégorie, des mots clés, le passer en brouillon ou non, etc.

Les catégories sont à renseigner telles qu’elles ont été définies dans le fichier categories.xml au niveau de l’=url= et pas du CDATA (ici par exemple, j’ai renseigné directement blog et non Blog ou 001).

Lorsque j’exporte, ça crée le fichier avec le bon nom (merci à Stéphane), puis ça remplit le fichier xml (avec encore un merci à Stéphane) en renseignant les balises correctement à partir de l’entête de mon fichier, et ça le met dans le bon dossier. Si un fichier avec le même id existe déjà, il demande si on veut l’écraser.

Création d’un billet light

Si j’ai utilisé org-protocol, j’ai une nouvelle section dans une des catégories du blog dans le fichier principal. Dans ce cas, le titre correspondra au header de la section et la catégorie, à la section parente et j’utilise C-c C-c pour ajouter des tags. Un raccourci plus tard, le fichier est correctement nommé, rempli (avec les mêmes valeurs par défaut) et déposé dans le bon dossier.

Enfin, dans les deux cas, le fichier tags.xml est mis à jour correctement (l’ancienne ligne est supprimée si l’article est mis à jour).

Par défaut je dépose/modifie les fichiers sur une copie locale du blog, mais il est possible d’utiliser tramp pour passer via ssh sur le serveur directement.

Reste à faire

Même si mon processus est maintenant plus fluide, il reste dans l’idéal des améliorations à apporter :

  • créer la catégorie dans le fichier si elle n’existe pas
  • créer un lien dans l’arborescence Blog/catégorie du fichier principal lors de la création d’un nouveau billet
  • utiliser un drawer dans les articles créés dans le fichier pour pouvoir réutiliser le même id
  • utiliser le processus d’=org-export-dispatch= pour pouvoir exporter et publier

Rien de bien méchant, mais l’utilisation n’en serait que plus agréable.

Liens vers les autres articles

Petit aparté pour finir. Si je souhaite faire un lien vers un autre article, j’utilise les abréviations d’org-mode. Sous l’entête je rajoute

#+LINK: article http://fredtantini.free.fr/blog/index.php?article%s

(Ne pas oublier de C-c C-c si on veut pouvoir cliquer dessus de suite.)

Ensuite, dans le texte, un lien de la forme

[[article:42][blabla]]

remplacera le %s par 42, et la réécriture d’url de pluxml prend ensuite le relais !

Footnotes:

1

Le titre est un peu mieux transformé qu’avant. Les signes diacritiques et les caractères non-ascii/alphanum sont supprimés (en adaptant et simplifiant http://ergoemacs.org/emacs/emacs_zap_gremlins.html), le nom de fichier est préfixé avec la date, puis mis dans le bon dossier YEAR/MONTH/YearMonthDay_title_with_underscore.org

Fil RSS des articles