Wie führe ich Selen in Xvfb aus?

91

Ich bin auf EC2-Instanz. Es gibt also keine GUI.

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

Dann mache ich das:

$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

Großartig, jetzt sollte alles funktionieren, oder?

Wenn ich meinen Code ausführe:

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

Ich verstehe das:

Error: cannot open display: :0
TIMEX
quelle
2
Wenn Sie auf einem System ohne X arbeiten, sollte Anzeige: 0 verfügbar sein. Versuchen Sie, Xvfb: 0 auszuführen - siehe auch xvfb-run, wie von @ema
fijiaaron
Für zukünftige Follower habe ich meine Lösung für Ubuntu Server beschrieben: namekdev.net/2016/08/…
Namek

Antworten:

35

Öffnen Sie ein Terminal und führen Sie diesen Befehl aus xhost +. Dieser Befehl muss jedes Mal ausgeführt werden, wenn Sie Ihren Computer neu starten. Wenn alles gut funktioniert, können Sie dies zu den Startbefehlen hinzufügen

Stellen Sie außerdem sicher, dass in Ihrer Datei / etc / environment eine Zeile vorhanden ist

export DISPLAY=:0.0 

Führen Sie dann Ihre Tests aus, um festzustellen, ob Ihr Problem behoben ist.

Bitte beachten Sie den Kommentar von sardathrion unten, bevor Sie diesen verwenden.

AJ
quelle
Sie müssen nur java -jar selenium-server-standalone-2.0b3.jar über die Befehlszeile ausführen und dann Ihre Tests ausführen
AJ
Ich bin auf einer EC2-Instanz, daher gibt es keine GUI. xhost: Anzeige ": 0.0" kann nicht geöffnet werden
TIMEX
@owa Sie benötigen auch die Umgebungsvariable DISPLAY in der Clientumgebung.
Keith
10
xhost +ist unsicher. Bitte benutzen Sie es nicht. Wenn Sie xhost verwenden müssen, fügen Sie die gewünschte Maschine hinzu und nicht + (auch bekannt als alles).
Sardathrion - gegen SE Missbrauch
170

Sie können PyVirtualDisplay (einen Python-Wrapper für Xvfb) verwenden, um kopflose WebDriver-Tests auszuführen.

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

Mehr Info


Sie können auch xvfbwrapper verwenden , ein ähnliches Modul (das jedoch keine externen Abhängigkeiten aufweist):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

oder noch besser, verwenden Sie es als Kontextmanager:

from xvfbwrapper import Xvfb

with Xvfb() as xvfb:
    # launch stuff inside virtual display here.
    # It starts/stops in this code block.
Corey Goldberg
quelle
2
@ Andrei OSX verwendet nicht standardmäßig X11
Sam Boosalis
Verwendete diese Antwort, damit es mit Vagrant + PyCharm + Django unter OS X funktioniert
chachan
Ich erhalte einen "Browser scheint beendet zu sein", wenn ich den obigen pyvirtualdisplay-Code implementiere
gtownrower
45

Der einfachste Weg ist wahrscheinlich die Verwendung von xvfb-run:

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

xvfb-run tanzt die ganze X-Autorität für Sie, probieren Sie es aus!

ema
quelle
Das ist genau das, wonach ich gesucht habe. Das Starten von Xvfb alleine schien für mich nicht zu funktionieren, aber die Verwendung von xvfb-run hat den Trick getan. Vielen Dank.
Reina Abolofia
8
Das DISPLAY=:1ist unnötig; xvfb-run setzt die Umgebungsvariable DISPLAY (normalerweise :99) auf etwas anderes, bevor der angegebene Befehl (in Ihrem Fall java -jar selenium-server...) gestartet wird
Alex Dupuy
20

Dies ist das Setup, das ich benutze:

Führen Sie vor dem Ausführen der Tests Folgendes aus:

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

Und nach den Tests:

/etc/init.d/xvfb stop

Die von init.dmir verwendete Datei sieht folgendermaßen aus:

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
Fall "$ 1" in
  Anfang)
    echo -n "Starten des virtuellen X-Frame-Puffers: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    Echo "."
    ;;
  halt)
    echo -n "Stoppen des virtuellen X-Frame-Puffers: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    Echo "."
    ;;
  Neustart)
    $ 0 Stop
    $ 0 starten
    ;;
  *)
  echo "Verwendung: /etc/init.d/xvfb {start | stop | restart}"
  Ausfahrt 1
esac
Ausfahrt 0
shang
quelle
Ich habe genau das getan und dann mein Skript ausgeführt. Ich erhalte jedoch immer noch Folgendes: Fehler: Anzeige kann nicht geöffnet werden :: 0. Muss ich auch den Selenium Java Server ausführen? Es scheint, als wäre es egal, ob ich es laufen
lasse
2
owalla, wenn Sie WebDriver verwenden, benötigen Sie den Selenium Java Server nicht.
Corey Goldberg
3

Wenn Sie Maven verwenden, können Sie das xvfb-maven-Plugin verwenden , um xvfb vor den Tests zu starten, sie mit der zugehörigen DISPLAYUmgebungsvariablen auszuführen und xvfb schließlich zu stoppen.

Toilette
quelle