Pages:
Actions
  • #1 par vivien le 02 Jan 2018
  • 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




    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)
  • #2 par jack le 02 Jan 2018
  • Au feeling:

    Activer la connexion à ton X pour un tiers:
    xhost +

    Configurer le serveur X à utiliser:
    export DISPLAY=:0
  • #3 par Hugues le 02 Jan 2018
  • gksu ne sert pas à ça ? je m'en servais il y'a longtemps
  • #4 par macmonac le 02 Jan 2018
  • 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é
  • #5 par Thornhill le 03 Jan 2018
  • 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
  • #6 par vivien le 03 Jan 2018
  • 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
  • #7 par xtof le 19 Jan 2018
  • Hello
    pourquoi ne pas utiliser phantomJs ?
    http://phantomjs.org/
  • #8 par vivien le 19 Jan 2018
  • 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.
  • #9 par xtof le 19 Jan 2018
  • Je l'utilise sur des serveurs - donc pas d'interface graphique - et ça fonctionne.

    DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
Pages:
Actions