La Fibre
Télécom => Logiciels et systèmes d'exploitation => Linux => Discussion démarrée par: vivien le 02 janvier 2018 à 22:26:49
-
Il est possible, via ChromeDriver de piloter un navigateur : Chrome, Chromium ou Firefox.
Je cherche à faire un petit programme en python, qui permet de remonter le temps d'affichage réel d'une page web, dans un vrai navigateur.
ChromeDriver sera lancé régulièrement depuis la crontab et dans ce cas là il n'arrive pas à déterminer dans quel écran envoyer chrome (je voudrais que cela soit sur l'écran par défaut)
=> Comment forcer un programme graphique démarré par crontab à utiliser l’environnement graphique par défaut au lieu de sortir en erreur ?
La documentation de ChromeDriver est ici : https://sites.google.com/a/chromium.org/chromedriver/
Voici le contenu de mon fichier test.py pour démo :
#!/usr/bin/env python2
import time
from selenium import webdriver
driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver') # Optional argument, if not specified will search path.
driver.get('https://lafibre.info/');
print "Ouvert"
time.sleep(3)
driver.quit()
print "Ferme"
Voici les pré-requis pour ce script python, sous Ubuntu / Debian :
sudo apt install chromium-browser chromium-chromedriver python-pip
sudo pip install --upgrade pip
sudo pip install selenium
Si je lance mon script depuis un terminal, lui même lancé depuis l'interface graphique de mon Ubuntu, tout fonctionne (chromium se lance et charge la page web) et j'ai ceci en ligne de commande :
$ ./test.py
Ouvert
Ferme
(https://lafibre.info/testdebit/ubuntu/201801_ChromeDriver_pilote_navigateur.png)
Si je lance mon script depuis un terminal lancé depuis SSH ou depuis la crontab, après une attente d'une minute, j'ai cette erreur et chomium ne s'est pas lancé :
$ ./test.py
Traceback (most recent call last):
File "./test.py", line 6, in <module>
driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver') # Optional argument, if not specified will search path.
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/webdriver.py", line 75, in __init__
desired_capabilities=desired_capabilities)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 154, in __init__
self.start_session(desired_capabilities, browser_profile)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 243, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 311, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
(Driver info: chromedriver=2.33,platform=Linux 4.13.0-21-generic x86_64)
-
Au feeling:
Activer la connexion à ton X pour un tiers:
xhost +
Configurer le serveur X à utiliser:
export DISPLAY=:0
-
gksu ne sert pas à ça ? je m'en servais il y'a longtemps
-
Bonjour,
Ton problème vient probablement de variables d'environnement non positionnées. La première pourrait donc être de les positionner.
Dans quel environnement s'exécute ton programme et ton navigateur ? Sur ta session ? Sur un environnement type VNC/X2GO ?
Pourquoi tu utilises cron ? Moi je ferais un while true avec un sleep et éventuellement si vraiment tu veux des heures régulières tu peux utiliser un module cron pour python.
A+
PS modifier le xhost pas forcèment une bonne idée au niveau sécurité
-
Si tu as la certitude que ton serveur X est bien actif lors du job cron, il suffit de positionner DISPLAY et XAUTHORITY avec les bonnes valeurs.
export DISPLAY=:0.0
export XAUTHORITY=/somewhere/.Xauthority
Une autre alternative est d'utiliser un serveur X virtuel dédié comme Xvfb qui sert justement à tester des clients X11 sans avoir besoin d'affichage réel.
Xvfb :15 &
export DISPLAY=:15
monprog
ou bien
xvfb-run monprog
-
Merci beaucoup.
Comme le test est lancé par le même utilisateur que celui qui à lancé l'interface graphique la solution est assez simple : rajouter DISPLAY=:0 devant le nom du script
Quand je me connecte à SSH DISPLAY=:0 ./test.py affiche bien le navigateur web sur l'écran de la machine qui l’exécute.
Je pense que cela fonctionne aussi parfaitement avec la crontab en préfixant le script par DISPLAY=:0
-
Hello
pourquoi ne pas utiliser phantomJs ?
http://phantomjs.org/
-
La réponse est simple : phantomJs est bien moins représentatif qu'un vrai navigateur.
Pour l'avoir utilisé, il a aussi besoin d'une interface graphique : sur un Ubuntu server sans interface, mon script ne fonctionne pas.
-
Je l'utilise sur des serveurs - donc pas d'interface graphique - et ça fonctionne.
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"