¿Cómo ejecuto Selenium en Xvfb?

92

Estoy en la instancia EC2. Entonces 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 ejecuto 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
TIMEX
fuente
2
Si está en un sistema sin X en ejecución, la pantalla: 0 debería estar disponible. Intente ejecutar Xvfb: 0 - también vea xvfb-run como lo menciona @ema
fijiaaron
Para futuros seguidores, describí mi solución para Ubuntu Server: namekdev.net/2016/08/…
Namek

Respuestas:

35

abre una terminal y ejecuta este comando xhost +. Este comando debe ejecutarse cada vez que reinicia su máquina. Si todo funciona bien, puede agregar esto 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 está resuelto.

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

AJ
fuente
Solo necesita ejecutar java -jar selenium-server-standalone-2.0b3.jar desde la línea de comando y luego ejecutar sus pruebas
AJ
Estoy en una instancia EC2, por lo que no hay GUI. xhost: no se puede abrir la pantalla ": 0.0"
TIMEX
@owa También necesita la variable de entorno DISPLAY en el entorno del cliente.
Keith
10
xhost +es inseguro. Por favor no lo use. Si tiene que usar xhost, agregue la máquina específica que desee y no + (también conocido como todo lo que sea).
Sardathrion - contra el abuso SE
170

Puede usar PyVirtualDisplay (un contenedor 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ícelo 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.
Corey Goldberg
fuente
2
@Andrei OSX no usa X11 por defecto
sam boosalis
Usé esta respuesta para que funcione con vagrant + PyCharm + Django en OS X: stackoverflow.com/q/29343109
chachan
Aparece un "navegador que parece haber salido" cuando implemento el código pyvirtualdisplay anterior
gtownrower
45

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 que toda la autoridad X baile por ti, ¡pruébalo!

ema
fuente
Esto es justo lo que estaba buscando. Iniciar Xvfb por sí solo no pareció funcionar para mí, pero usar xvfb-run funcionó. Gracias.
Reina Abolofia
9
El DISPLAY=:1es innecesario; xvfb-run establece la variable de entorno DISPLAY en algo más (generalmente :99) antes de iniciar el comando especificado (en su caso java -jar selenium-server...)
Alex Dupuy
20

Esta es la configuración que uso:

Antes de ejecutar las pruebas, ejecute:

exportar DISPLAY =: 99
/etc/init.d/xvfb inicio

Y después de las pruebas:

/etc/init.d/xvfb detener

El init.darchivo que utilizo tiene este aspecto:

#! / 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 búfer de trama X virtual: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    eco "."
    ;;
  detener)
    echo -n "Deteniendo el búfer de trama X virtual: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    eco "."
    ;;
  reiniciar)
    $ 0 parada
    $ 0 comienzo
    ;;
  *)
  echo "Uso: /etc/init.d/xvfb {iniciar | detener | reiniciar}"
  salida 1
esac
salir 0
shang
fuente
Hice exactamente esto y luego ejecuté mi guión. Sin embargo, sigo recibiendo esto: Error: no se puede abrir la pantalla:: 0. Además, ¿necesito ejecutar el servidor java selenium? Parece que no importa si lo ejecuto o no ...
TIMEX
2
owalla, si usa WebDriver, entonces no necesita el Selenium Java Server.
Corey Goldberg
3

Si usa Maven, puede usar xvfb-maven-plugin para iniciar xvfb antes de las pruebas, ejecutarlas usando DISPLAYla variable de entorno relacionada y detener xvfb después de todo.

Toilal
fuente