Jak uruchomić Selenium w Xvfb?

93

Jestem na instancji EC2. Więc nie ma GUI.

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

Następnie robię to:

$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

Świetnie, wszystko powinno teraz działać, prawda?

Kiedy uruchamiam mój kod:

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

Rozumiem:

Error: cannot open display: :0
TIMEX
źródło
3
Jeśli pracujesz w systemie bez uruchomionego X, powinno być dostępne display: 0. Spróbuj uruchomić Xvfb: 0 - zobacz także xvfb-run, o którym wspomniał @ema
fijiaaron
1
Dla przyszłych obserwujących opisałem moje rozwiązanie dla Ubuntu Server: namekdev.net/2016/08/…
Namek

Odpowiedzi:

35

otwórz terminal i uruchom to polecenie xhost +. To polecenie należy uruchamiać za każdym razem, gdy ponownie uruchamiasz komputer. Jeśli wszystko działa dobrze, możesz dodać to do poleceń startowych

Upewnij się również, że w pliku / etc / environment jest linia

export DISPLAY=:0.0 

Następnie przeprowadź testy, aby sprawdzić, czy problem został rozwiązany.

Wszyscy prosimy o zapoznanie się z komentarzem sardathrion poniżej przed użyciem tego.

AJ
źródło
Wystarczy uruchomić java -jar selenium-server-standalone-2.0b3.jar z wiersza poleceń, a następnie uruchomić testy
AJ
Jestem na instancji EC2, więc nie ma GUI. xhost: nie można otworzyć wyświetlacza „: 0.0”
TIMEX
@owa Potrzebujesz także zmiennej środowiskowej DISPLAY w środowisku klienta.
Keith
10
xhost +jest niepewny. Proszę go nie używać. Jeśli musisz użyć xhost, dodaj konkretną maszynę, którą chcesz, a nie + (aka wszystko cokolwiek).
Sardathrion - przeciwko nadużyciom SE
171

Możesz użyć PyVirtualDisplay (opakowania Pythona dla Xvfb) do uruchamiania bezgłowych testów WebDriver.

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

więcej informacji


Możesz także użyć xvfbwrapper , który jest podobnym modułem (ale nie ma żadnych zewnętrznych zależności):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

lub jeszcze lepiej, użyj go jako menedżera kontekstu:

from xvfbwrapper import Xvfb

with Xvfb() as xvfb:
    # launch stuff inside virtual display here.
    # It starts/stops in this code block.
Corey Goldberg
źródło
2
@Andrei OSX domyślnie nie używa X11
sam boosalis
Użyłem tej odpowiedzi, aby działało z vagrant + PyCharm + Django na OS X: stackoverflow.com/q/29343109
chachan
Po zaimplementowaniu powyższego kodu pyvirtualdisplay pojawia się komunikat „Wygląda na to, że przeglądarka została zamknięta”
gtownrower
45

Najłatwiejszym sposobem jest prawdopodobnie użycie xvfb-run:

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

xvfb-run wykonuje dla Ciebie cały taniec autorytetu X, spróbuj!

ema
źródło
Właśnie tego szukałem. Samo uruchomienie Xvfb wydawało się nie działać, ale użycie xvfb-run załatwiło sprawę. Dzięki.
Reina Abolofia
9
To DISPLAY=:1jest niepotrzebne; xvfb-run ustawia zmienną środowiskową DISPLAY na coś innego (zwykle :99) przed uruchomieniem określonego polecenia (w twoim przypadku java -jar selenium-server...)
Alex Dupuy
20

Oto konfiguracja, której używam:

Przed uruchomieniem testów wykonaj:

eksport WYŚWIETLACZ =: 99
/etc/init.d/xvfb start

A po testach:

/etc/init.d/xvfb stop

Do init.dużytku plik I wygląda to tak:

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {WYŚWIETLANIE: 1} .pid
sprawa „$ 1” w
  początek)
    echo -n "Uruchamianie wirtualnego bufora ramki X: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    Echo "."
    ;;
  zatrzymać)
    echo -n "Zatrzymywanie wirtualnego bufora ramki X: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    Echo "."
    ;;
  restart)
    0 $ stop
    0 $ start
    ;;
  *)
  echo "Użycie: /etc/init.d/xvfb {start | stop | restart}"
  wyjście 1
esac
wyjście 0
shang
źródło
Zrobiłem dokładnie to, a następnie uruchomiłem skrypt. Jednak nadal widzę to: Błąd: nie można otworzyć ekranu:: 0. Czy muszę też uruchamiać serwer selenium java? Wygląda na to, że nie ma znaczenia, czy go uruchomię, czy nie ...
TIMEX
2
owalla, jeśli używasz WebDriver, nie potrzebujesz Selenium Java Server.
Corey Goldberg
3

Jeśli używasz Mavena, możesz użyć xvfb-maven-plugin, aby uruchomić xvfb przed testami, uruchomić je przy użyciu powiązanej DISPLAYzmiennej środowiskowej i ostatecznie zatrzymać xvfb.

Szkoda
źródło