ejecutar selenio con crontab(python)
ubuntu selenium (3)
El problema más evidente al tratar de iniciar un navegador desde cron
es que incluso si tiene X ejecutándose en su máquina, la variable de entorno DISPLAY
no está configurada para los procesos que se ejecutan desde su crontab
por lo que iniciar un navegador desde allí fallará.
Las soluciones van desde lo trivial hasta lo súper sofisticado. Una solución trivial sería aceptar que su script no se ejecutará si no hay X ejecutándose y establecer manualmente DISPLAY
en :0
, que es el número de pantalla predeterminado para el servidor X predeterminado que inicia Ubuntu.
Por ejemplo, si uso este comando en una línea de crontab
, Chrome se inicia sin problemas:
DISPLAY=:0 google-chrome
Tengo un script de Python que llama a Chrome a través del selenio con la siguiente línea.
ff = webdriver.Chrome(''/home/user01/webScraping/CollectAndGo/chromedriver'')
El script de python se llama desde un script de shell.
python /home/user01/webScraping/CollectAndGo/cgcom.py > /home/user01/webScraping/CollectAndGo/cgcom.log 2>&1
Cuando ejecuto el script desde el terminal o simplemente ejecuto el archivo .sh, funciona perfectamente, pero cuando programo un trabajo crontab, falla con el siguiente error.
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u''unknown error: Chrome failed to start: exited abnormally/n (Driver info: chromedriver=2.9.248304,platform=Linux 3.5.0-36-generic x86_64)''
El error está relacionado con la primera línea de código de esta pregunta. ¿Alguien sabe por qué esto podría estar pasando?
Es probable que Crontab se esté ejecutando como un usuario que no tiene permiso para acceder al directorio / archivo chromedriver.
Mire las respuestas aquí sobre cómo ejecutar crontab como un usuario específico.
los controladores web de selenio necesitan una sesión X para ejecutar el script. Los scripts de Cron normalmente se ejecutan sin la sesión X. Agrega una sesión X en tu script cron. Como sigue: * 11 * * * export DISPLAY =: 0; tu script.py