Bagaimana cara menjalankan Selenium di Xvfb?

93

Saya menggunakan contoh EC2. Jadi tidak ada GUI.

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

Lalu saya melakukan ini:

$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

Bagus, semuanya harus berfungsi sekarang, bukan?

Ketika saya menjalankan kode saya:

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

Saya mengerti ini:

Error: cannot open display: :0
TIMEX
sumber
3
Jika Anda menggunakan sistem tanpa X yang berjalan, tampilan: 0 seharusnya tersedia. Coba jalankan Xvfb: 0 - juga lihat xvfb-run seperti yang disebutkan oleh @ema
fijiaaron
1
Untuk pengikut di masa mendatang, saya menjelaskan solusi saya untuk Server Ubuntu: namekdev.net/2016/08/…
Namek

Jawaban:

35

buka terminal dan jalankan perintah ini xhost +. Perintah ini perlu dijalankan setiap kali Anda me-restart mesin Anda. Jika semuanya berfungsi dengan baik mungkin Anda dapat menambahkan ini ke perintah startup

Pastikan juga di file / etc / environment Anda ada baris

export DISPLAY=:0.0 

Dan kemudian, jalankan pengujian Anda untuk melihat apakah masalah Anda telah teratasi.

Semua harap perhatikan komentar dari sardathrion di bawah ini sebelum menggunakan ini.

AJ
sumber
Anda hanya perlu menjalankan java -jar selenium-server-standalone-2.0b3.jar dari baris perintah dan kemudian menjalankan pengujian Anda
AJ
Saya menggunakan instans EC2, jadi tidak ada GUI. xhost: tidak dapat membuka tampilan ": 0.0"
TIMEX
@owa Anda juga membutuhkan variabel lingkungan DISPLAY di lingkungan klien.
Keith
10
xhost +tidak aman. Tolong jangan gunakan itu. Jika Anda harus menggunakan xhost, tambahkan mesin spesifik yang Anda inginkan dan bukan + (alias semuanya).
Sardathrion - terhadap pelecehan SE
171

Anda dapat menggunakan PyVirtualDisplay (pembungkus Python untuk Xvfb) untuk menjalankan pengujian 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()

Info lebih lanjut


Anda juga dapat menggunakan xvfbwrapper , yang merupakan modul serupa (tetapi tidak memiliki dependensi eksternal):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

atau lebih baik lagi, gunakan sebagai pengelola konteks:

from xvfbwrapper import Xvfb

with Xvfb() as xvfb:
    # launch stuff inside virtual display here.
    # It starts/stops in this code block.
Corey Goldberg
sumber
2
@Andrei OSX tidak menggunakan X11 secara default
sam boosalis
Gunakan jawaban ini untuk membuatnya bekerja dengan gelandangan + PyCharm + Django di OS X: stackoverflow.com/q/29343109
chachan
Saya mendapatkan "browser tampaknya telah keluar" ketika saya menerapkan kode pyvirtualdisplay di atas
gtownrower
45

Cara termudah mungkin adalah menggunakan xvfb-run:

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

xvfb-run melakukan seluruh otoritas X menari untuk Anda, cobalah!

ema
sumber
Inilah yang saya cari. Memulai Xvfb sendiri sepertinya tidak berhasil untuk saya, tetapi menggunakan xvfb-run berhasil. Terima kasih.
Reina Abolofia
9
Itu DISPLAY=:1tidak perlu; xvfb-run menetapkan variabel lingkungan DISPLAY ke sesuatu yang lain (biasanya :99) sebelum memulai perintah yang ditentukan (dalam kasus Anda, java -jar selenium-server...)
Alex Dupuy
20

Ini adalah pengaturan yang saya gunakan:

Sebelum menjalankan tes, jalankan:

ekspor DISPLAY =: 99
/etc/init.d/xvfb mulai

Dan setelah tes:

/etc/init.d/xvfb stop

The init.dfile I digunakan terlihat seperti ini:

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {TAMPILAN: 1} .pid
kasus "$ 1" masuk
  Mulailah)
    echo -n "Memulai buffer frame X virtual: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    echo "."
    ;;
  berhenti)
    echo -n "Menghentikan buffer frame X virtual: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    echo "."
    ;;
  mengulang kembali)
    $ 0 berhenti
    $ 0 mulai
    ;;
  *)
  echo "Penggunaan: /etc/init.d/xvfb {start | stop | restart}"
  keluar 1
esac
keluar 0
shang
sumber
Saya melakukan persis seperti ini dan kemudian menjalankan skrip saya. Namun, saya masih mendapatkan ini: Kesalahan: tidak dapat membuka tampilan:: 0. Juga, apakah saya perlu menjalankan server java selenium? Sepertinya tidak masalah saya menjalankannya atau tidak ...
TIMEX
2
owalla, jika Anda menggunakan WebDriver, maka Anda tidak memerlukan Server Java Selenium.
Corey Goldberg
3

Jika Anda menggunakan Maven, Anda dapat menggunakan xvfb-maven-plugin untuk memulai xvfb sebelum pengujian, menjalankannya menggunakan DISPLAYvariabel lingkungan terkait , dan menghentikan xvfb.

Toilal
sumber