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
    
Respuestas:
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 inicioTambién asegúrese de que en su archivo / etc / environment haya una línea
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.
fuente
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).Puede usar PyVirtualDisplay (un contenedor de Python para Xvfb) para ejecutar pruebas de WebDriver sin cabeza.
más información
También puede usar xvfbwrapper , que es un módulo similar (pero no tiene dependencias externas):
o mejor aún, utilícelo como administrador de contexto:
fuente
La forma más fácil es probablemente usar xvfb-run:
xvfb-run hace que toda la autoridad X baile por ti, ¡pruébalo!
fuente
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 casojava -jar selenium-server...)Esta es la configuración que uso:
Antes de ejecutar las pruebas, ejecute:
Y después de las pruebas:
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 0fuente
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.fuente