Come eseguo Selenium in Xvfb?


91

Sono sull'istanza EC2. Quindi non c'è GUI.

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

Quindi faccio questo:

$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

Fantastico, ora dovrebbe funzionare tutto, giusto?

Quando eseguo il mio codice:

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") 

Ho capito:

Error: cannot open display: :0

2
Se sei su un sistema senza X in esecuzione, display: 0 dovrebbe essere disponibile. Prova a eseguire Xvfb: 0 - vedi anche xvfb-run come menzionato da @ema
fijiaaron

Per i futuri follower, ho descritto la mia soluzione per Ubuntu Server: namekdev.net/2016/08/…
Namek

Risposte:


35

apri un terminale ed esegui questo comando xhost +. Questo comando deve essere eseguito ogni volta che riavvii la macchina. Se tutto funziona correttamente, puoi aggiungerlo ai comandi di avvio

Assicurati anche che nel tuo file / etc / environment ci sia una riga

export DISPLAY=:0.0 

Quindi, esegui i test per vedere se il problema è stato risolto.

Tutti si prega di notare il commento di sardathrion di seguito prima di utilizzare questo.


Devi solo eseguire java -jar selenium-server-standalone-2.0b3.jar dalla riga di comando e quindi eseguire i test
AJ

Sono su un'istanza EC2, quindi non c'è GUI. xhost: impossibile aprire il display ": 0.0"
TIMEX

@owa È necessaria anche la variabile d'ambiente DISPLAY nell'ambiente client.
Keith

10
xhost +è insicuro. Per favore non usarlo. Se devi usare xhost, aggiungi la macchina specifica che desideri e non + (ovvero qualsiasi cosa).
Sardathrion - contro l'abuso di SE il

170

Puoi usare PyVirtualDisplay (un wrapper Python per Xvfb) per eseguire test WebDriver headless.

#!/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()

Ulteriori informazioni


Puoi anche usare xvfbwrapper , che è un modulo simile (ma non ha dipendenze esterne):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

o meglio ancora, usalo come gestore di contesto:

from xvfbwrapper import Xvfb

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

2
@Andrei OSX non usa X11 per impostazione predefinita
sam boosalis

Utilizzato questa risposta per farlo funzionare con il vagabondo + PyCharm + Django su OS X: stackoverflow.com/q/29343109
chachan

Quando implemento il codice pyvirtualdisplay sopra
errore

45

Il modo più semplice è probabilmente usare xvfb-run:

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

xvfb-run fa tutta la danza dell'autorità di X per te, provaci!


Questo è proprio quello che stavo cercando. L'avvio di Xvfb da solo non sembrava funzionare per me, ma l'uso di xvfb-run ha funzionato. Grazie.
Reina Abolofia

9
Non DISPLAY=:1è necessario; xvfb-run imposta la variabile d'ambiente DISPLAY su qualcos'altro (di solito :99) prima di avviare il comando specificato (nel tuo caso java -jar selenium-server...)
Alex Dupuy

20

Questa è la configurazione che utilizzo:

Prima di eseguire i test, eseguire:

export DISPLAY =: 99
/etc/init.d/xvfb start

E dopo i test:

/etc/init.d/xvfb stop

Il init.dfile che uso è simile a questo:

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
caso "$ 1" in
  inizio)
    echo -n "Avvio del frame buffer X virtuale: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    eco "."
    ;;
  fermare)
    echo -n "Arresto del frame buffer X virtuale: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    eco "."
    ;;
  ricomincia)
    $ 0 stop
    Inizio $ 0
    ;;
  *)
  echo "Utilizzo: /etc/init.d/xvfb {start | stop | restart}"
  uscita 1
esac
uscita 0

Ho fatto esattamente questo e poi ho eseguito il mio script. Tuttavia, ottengo ancora questo: Errore: impossibile aprire il display:: 0. Inoltre, devo eseguire il server java selenium? Sembra che non importi se lo eseguo o no ...
TIMEX

2
owalla, se usi WebDriver, non hai bisogno del Selenium Java Server.
Corey Goldberg

3

Se usi Maven, puoi usare xvfb-maven-plugin per avviare xvfb prima dei test, eseguirli usando DISPLAYla variabile d'ambiente correlata e fermare xvfb dopo tutto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.