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

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.


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.

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!


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.