Làm cách nào để chạy Selenium trong Xvfb?


92

Tôi đang sử dụng phiên bản EC2. Vì vậy, không có GUI.

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

Sau đó, tôi làm điều này:

$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

Tuyệt vời, mọi thứ sẽ hoạt động ngay bây giờ, phải không?

Khi tôi chạy mã của mình:

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

Tôi hiểu điều này:

Error: cannot open display: :0

2
Nếu bạn đang sử dụng hệ thống không có X đang chạy, thì hiển thị: 0 sẽ khả dụng. Thử chạy Xvfb: 0 - also see Xvfb hạn như đã đề cập bởi @ema
fijiaaron

Đối với tín đồ trong tương lai, tôi đã mô tả giải pháp của tôi cho Ubuntu Server: namekdev.net/2016/08/...
Namek

Câu trả lời:


35

mở một thiết bị đầu cuối và chạy lệnh này xhost +. Các lệnh này cần được chạy mỗi khi bạn khởi động lại máy. Nếu mọi thứ hoạt động tốt, bạn có thể thêm điều này vào lệnh khởi động

Ngoài ra, hãy đảm bảo rằng trong tệp / etc / environment của bạn có một dòng

export DISPLAY=:0.0 

Và sau đó, chạy thử nghiệm của bạn để xem liệu sự cố của bạn có được giải quyết hay không.

Tất cả xin vui lòng ghi chú bình luận từ sardathrion dưới đây trước khi sử dụng này.


Bạn chỉ cần thực thi java -jar selenium-server-standalone-2.0b3.jar từ dòng lệnh và sau đó chạy các thử nghiệm của mình
AJ

Tôi đang sử dụng phiên bản EC2, vì vậy không có GUI. xhost: không thể mở hiển thị ": 0.0"
TIMEX

@owa Bạn cũng cần biến môi trường HIỂN THỊ trong môi trường máy khách.
Keith,

10
xhost +không an toàn. Vui lòng không sử dụng nó. Nếu bạn phải sử dụng xhost, hãy thêm máy cụ thể mà bạn muốn chứ không phải + (hay còn gọi là mọi thứ).
Sardathrion - chống SE lạm dụng

170

Bạn có thể sử dụng PyVirtualDisplay (một trình bao bọc Python cho Xvfb) để chạy các bài kiểm tra WebDriver không đầu.

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

thêm thông tin


Bạn cũng có thể sử dụng xvfbwrapper , là một mô-đun tương tự (nhưng không có phụ thuộc bên ngoài):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

hoặc tốt hơn, hãy sử dụng nó như một trình quản lý ngữ cảnh:

from xvfbwrapper import Xvfb

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

2
@Andrei OSX không sử dụng X11 theo mặc định
sam boosalis

Sử dụng câu trả lời này để làm cho nó làm việc với lang thang + PyCharm + Django trên OS X: stackoverflow.com/q/29343109
chachan

Tôi nhận được một "trình duyệt dường như đã thoát" khi tôi thực hiện mã pyvirtualdisplay trên
gtownrower

45

Cách dễ nhất có lẽ là sử dụng xvfb-run:

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

xvfb-run có nhảy toàn bộ quyền X cho bạn, hãy thử!


Đây chỉ là những gì tôi đang tìm kiếm. Tự khởi động Xvfb dường như không hiệu quả với tôi, nhưng sử dụng xvfb-run đã làm được điều đó. Cảm ơn.
Reina Abolofia

9
DISPLAY=:1không cần thiết; Xvfb ương bộ biến môi trường DISPLAY để cái gì khác (thường :99) trước khi bắt đầu lệnh quy định (trong trường hợp của bạn, java -jar selenium-server...)
Alex Dupuy

20

Đây là thiết lập tôi sử dụng:

Trước khi chạy các bài kiểm tra, hãy thực hiện:

xuất DISPLAY =: 99
/etc/init.d/xvfb start

Và sau khi kiểm tra:

/etc/init.d/xvfb dừng

Các init.dtập tin tôi sử dụng trông như sau:

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
trường hợp "$ 1" trong
  khởi đầu)
    echo -n "Khởi động bộ đệm khung X ảo: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile - background --exec $ XVFB - $ XVFBARGS
    tiếng vang "."
    ;;
  dừng lại)
    echo -n "Dừng bộ đệm khung X ảo: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    tiếng vang "."
    ;;
  khởi động lại)
    $ 0 dừng
    $ 0 bắt đầu
    ;;
  *)
  echo "Cách sử dụng: /etc/init.d/xvfb {start | stop | restart}"
  lối ra 1
esac
thoát 0

Tôi đã làm chính xác điều này và sau đó chạy kịch bản của mình. Tuy nhiên, tôi vẫn nhận được điều này: Lỗi: không thể mở hiển thị:: 0. Ngoài ra, tôi có cần chạy máy chủ java selenium không? Có vẻ như không quan trọng nếu tôi chạy nó hay không ...
TIMEX

2
owalla, nếu bạn sử dụng WebDriver, thì bạn không cần Selenium Java Server.
Corey Goldberg

3

Nếu bạn sử dụng Maven, bạn có thể sử dụng xvfb-maven-plugin để khởi động xvfb trước khi kiểm tra, chạy chúng bằng cách sử dụng DISPLAYbiến môi trường liên quan và dừng xvfb sau cùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.