¿Cómo ejecuto Selenium en Xvfb?

Estoy en la instancia de EC2. Así que no hay GUI.

$pip install selenium $sudo apt-get install firefox xvfb 

Entonces hago esto:

 $Xvfb :1 -screen 0 1024x768x24 2>&1 >/dev/null & $DISPLAY=:1 java -jar selenium-server-standalone-2.0b3.jar 05:08:31.227 INFO - Java: Sun Microsystems Inc. 19.0-b09 05:08:31.229 INFO - OS: Linux 2.6.32-305-ec2 i386 05:08:31.233 INFO - v2.0 [b3], with Core v2.0 [b3] 05:08:32.121 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub 05:08:32.122 INFO - Version Jetty/5.1.x 05:08:32.123 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver] 05:08:32.124 INFO - Started HttpContext[/selenium-server,/selenium-server] 05:08:32.124 INFO - Started HttpContext[/,/] 05:08:32.291 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@1186fab 05:08:32.292 INFO - Started HttpContext[/wd,/wd] 05:08:32.295 INFO - Started SocketListener on 0.0.0.0:4444 05:08:32.295 INFO - Started org.openqa.jetty.jetty.Server@1ffb8dc 

Genial, todo debería funcionar ahora, ¿verdad?

Cuando corro mi código:

 from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.keys import Keys browser = webdriver.Firefox() browser.get("http://www.yahoo.com") 

Entiendo esto:

 Error: cannot open display: :0 

Abre un terminal y ejecuta este comando xhost + . Estos comandos deben ejecutarse cada vez que reinicie su máquina. Si todo funciona bien, puede agregarlo a los comandos de inicio.

También asegúrese de que en su archivo / etc / environment haya una línea

 export DISPLAY=:0.0 

Y luego, ejecute sus pruebas para ver si su problema se resuelve.

Todos tengan en cuenta el comentario de sardathrion a continuación antes de usar esto.

Puede usar PyVirtualDisplay (un envoltorio de Python para Xvfb) para ejecutar pruebas de WebDriver sin cabeza.

 #!/usr/bin/env python from pyvirtualdisplay import Display from selenium import webdriver display = Display(visible=0, size=(800, 600)) display.start() # now Firefox will run in a virtual display. # you will not see the browser. browser = webdriver.Firefox() browser.get('http://www.google.com') print browser.title browser.quit() display.stop() 

más información


También puede usar xvfbwrapper , que es un módulo similar (pero no tiene dependencias externas):

 from xvfbwrapper import Xvfb vdisplay = Xvfb() vdisplay.start() # launch stuff inside virtual display here vdisplay.stop() 

O mejor aún, utilízalo como administrador de contexto:

 from xvfbwrapper import Xvfb with Xvfb() as xvfb: # launch stuff inside virtual display here. # It starts/stops in this code block. 

La forma más fácil es probablemente usar xvfb-run:

 DISPLAY=:1 xvfb-run java -jar selenium-server-standalone-2.0b3.jar 

xvfb-run hace bailar a toda la autoridad X por ti, ¡pruébalo!

Esta es la configuración que utilizo:

Antes de ejecutar las pruebas, ejecute:

  exportación PANTALLA =: 99
 /etc/init.d/xvfb start

Y después de las pruebas:

  /etc/init.d/xvfb stop 

El archivo init.d que uso se ve así:

  #! / bin / bash

 XVFB = / usr / bin / Xvfb
 XVFBARGS = "$ DISPLAY -ac-screen 0 1024x768x16"
 PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
 caso "$ 1" en
   comienzo)
     echo -n "Iniciando el buffer de marco virtual X: Xvfb"
     / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
     eco "."
     ;;
   detener)
     echo -n "Deteniendo el buffer de marco virtual X: Xvfb"
     / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
     eco "."
     ;;
   reiniciar)
     $ 0 parada
     $ 0 de inicio
     ;;
   *)
   echo "Uso: /etc/init.d/xvfb {inicio | detener | reiniciar}"
   salida 1
 esac
 salida 0 

Si usa Maven, puede usar xvfb-maven-plugin para iniciar xvfb antes de las pruebas, ejecútelos utilizando la variable de entorno DISPLAY relacionada y detenga xvfb después de todo.