2017-07-11 4 views
0

J'ai besoin d'exécuter un script Python qui utilise Sélénium WebDriver:script Python WebDriver OK de la console mais ne démarre pas comme un service Upstart

import platform 
from selenium import webdriver 
from pyvirtualdisplay import Display 

driver = None 

if platform.system() == 'Linux': 
    print("Initializing browser for chrome...") 
    DISPLAY = Display(visible=0, size=(800, 600)) 
    DISPLAY.start() 
    print("Started display") 
    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument('--no-sandbox') 
    driver = webdriver.Chrome('/usr/local/bin/chromedriver', chrome_options=chrome_options) 
    print("Done init chrome") 
    connected = True 
else: 
    try: 
     print("Starting firefox...") 
     driver = webdriver.Firefox() 
     connected = True 
    except: 
     print("Could not connect through firefox") 

if driver: 
    print("driver ok") 
    driver.quit() 
    print("All ok") 

Le script est exécuté OK de la console:

sudo ~/environments/scrapers/bin/python test_webdriver.py 
Initializing browser for chrome... 
Started display 
Done init chrome 
driver ok 
All ok 

Mais donne une erreur de WebDriverException si vous essayez d'exécuter en utilisant une strophe exec avec Upstart:

Initializing browser for chrome... 
Started display 
... 
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally 
    (Driver info: chromedriver=2.26.436382 (70eb799287ce4c2208441fc057053a5b07ceabac),platform=Linux 4.8.0-58-generic x86_64) 

J'ai ajouté des chemins éventuellement absents dans le script upstart, comme ceci

env PYTHON_HOME=/home/rsa-key-20161031/environments/scrapers 
env PATH=/usr/local/bin:/usr/bin:$PYTHON_HOME:$PATH 
env ENV=production 
env DISPLAY=:10 
chdir /home/user/project 
console log 
exec $PYTHON_HOME/bin/python test_webdriver.py 

Sans effet. La recherche d'erreur ne donne rien de spécifique à cela. Toute idée sur la façon de le faire fonctionner est très appréciée.

Mise à jour: Ma solution actuelle est d'utiliser Cron car il ne semble pas avoir de problèmes avec Xvfb. J'aimerais toujours beaucoup savoir s'il est possible d'exécuter une tâche webdriver en tant que service. J'ai également essayé d'utiliser Selenium comme pilote web distant, avec les mêmes résultats négatifs (Chrome quitte après apparemment ne pas pouvoir se connecter à un affichage virtuel)

+2

Upstart n'a pas de session X-Windows avec laquelle démarrer Chrome. Upstart et autres systèmes de gestion de services Linux (systemd, sysVinit) ne sont pas conçus pour être utilisés avec des services reposant sur une interface graphique. –

+0

Merci; le fait que j'utilise Pyvirtualdisplay/start Xvfb en tant que processus séparé change-t-il quelque chose? –

Répondre

1

J'ai été confronté à une situation similaire, alors que j'ai configuré pytest pour fonctionner avec sélénium et firefox webdriver.

Comme solution, vous pouvez installer xvfb dire dans debian

sudo apt install xvfb 

Maintenant, vous pouvez régler votre fichier arriviste après la position exec, de sorte que xvfb est appelée avec votre script en tant que paramètre

xvfb-run --server-num=10 <script> 

De cette façon, xvfb est démarré devant votre script.

+0

Bonne idée, merci; en essayant cela; au démarrage Xvfb-run donne l'erreur suivante: '/ usr/bin/xvfb-run: mktemp: not found', alors que mktemp est présent dans le système. Des pensées à ce sujet? –

+1

@AlexBausk Heureux d'entendre que cela fonctionne presque. Je suppose que 'mktemp' ne fait pas partie de votre variable PATH; donc tapez 'which mktemp' (dans mon cas'/bin') et ajoutez le chemin avec un deux-points i.e 'env PATH =/bin:/usr/local/bin: ...' – andpei

+0

Wow, cela fonctionne réellement maintenant. Je suis incroyablement reconnaissant pour votre aide! Cela m'a embêté sans fin –