ฉันจะเรียกใช้ซีลีเนียมใน Xvfb ได้อย่างไร


93

ฉันใช้อินสแตนซ์ EC2 ดังนั้นจึงไม่มี GUI

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

จากนั้นฉันจะทำสิ่งนี้:

$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

เยี่ยมมากตอนนี้ทุกอย่างควรจะใช้งานได้ใช่มั้ย?

เมื่อฉันเรียกใช้รหัสของฉัน:

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

ฉันได้รับสิ่งนี้:

Error: cannot open display: :0

3
หากคุณอยู่ในระบบที่ไม่มี X ทำงานอยู่ควรแสดง: 0 ลองใช้ Xvfb: 0 - ดู xvfb-run ตามที่ @ema
fijiaaron

1
สำหรับผู้ติดตามในอนาคตฉันได้อธิบายวิธีแก้ปัญหาสำหรับเซิร์ฟเวอร์ Ubuntu: namekdev.net/2016/08/…
Namek

คำตอบ:


35

เปิดเทอร์มินัลและรันคำสั่ง xhost +นี้ คำสั่งนี้จะต้องรันทุกครั้งที่คุณรีสตาร์ทเครื่อง หากทุกอย่างทำงานได้ดีคุณสามารถเพิ่มสิ่งนี้ในคำสั่งเริ่มต้นได้

ตรวจสอบให้แน่ใจในไฟล์ / etc / environment ของคุณมีบรรทัด

export DISPLAY=:0.0 

จากนั้นทำการทดสอบเพื่อดูว่าปัญหาของคุณได้รับการแก้ไขหรือไม่

โปรดทราบความคิดเห็นจาก sardathrion ด้านล่างก่อนใช้สิ่งนี้


คุณต้องรัน java -jar selenium-server-standalone-2.0b3.jar จากบรรทัดคำสั่งจากนั้นเรียกใช้การทดสอบของคุณ
AJ

ฉันใช้อินสแตนซ์ EC2 ดังนั้นจึงไม่มี GUI xhost: ไม่สามารถเปิด display ": 0.0"
TIMEX

@owa คุณยังต้องมีตัวแปรสภาพแวดล้อม DISPLAY ในสภาพแวดล้อมไคลเอนต์
Keith

10
xhost +ไม่ปลอดภัย กรุณาอย่าใช้มัน หากคุณต้องใช้ xhost ให้เพิ่มเครื่องเฉพาะที่คุณต้องการไม่ใช่ + (หรือที่เรียกว่าทุกอย่าง)
Sardathrion - ต่อต้านการละเมิด SE

171

คุณสามารถใช้PyVirtualDisplay (Python wrapper สำหรับ Xvfb) เพื่อเรียกใช้การทดสอบ 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()

ข้อมูลเพิ่มเติม


คุณยังสามารถใช้xvfbwrapperซึ่งเป็นโมดูลที่คล้ายกัน (แต่ไม่มีการอ้างอิงภายนอก):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

หรือดีกว่านั้นให้ใช้เป็นตัวจัดการบริบท:

from xvfbwrapper import Xvfb

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

2
@Andrei OSX ไม่ใช้ X11 โดยค่าเริ่มต้น
sam boosalis

ใช้คำตอบนี้เพื่อให้ใช้งานได้กับ vagrant + PyCharm + Django บน OS X: stackoverflow.com/q/29343109
chachan

ฉันได้รับ "เบราว์เซอร์ดูเหมือนจะออก" เมื่อฉันใช้โค้ด pyvirtualdisplay ด้านบน
gtownrower

45

วิธีที่ง่ายที่สุดคือใช้ xvfb-run:

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

xvfb-run ทำให้ผู้มีอำนาจ X ทั้งหมดเต้นให้คุณลองดูสิ!


นี่เป็นเพียงสิ่งที่ฉันกำลังมองหา การเริ่มต้น Xvfb ด้วยตัวเองดูเหมือนจะไม่ได้ผลสำหรับฉัน แต่การใช้ xvfb-run เป็นเคล็ดลับ ขอบคุณ.
Reina Abolofia

9
DISPLAY=:1ไม่จำเป็น; xvfb-run ตั้งค่าตัวแปรสภาวะแวดล้อม DISPLAY เป็นอย่างอื่น (โดยปกติ:99) ก่อนเริ่มคำสั่งที่ระบุ (ในกรณีของคุณjava -jar selenium-server...)
Alex Dupuy

20

นี่คือการตั้งค่าที่ฉันใช้:

ก่อนทำการทดสอบให้ดำเนินการ:

ส่งออก DISPLAY =: 99
/etc/init.d/xvfb เริ่มต้น

และหลังการทดสอบ:

/etc/init.d/xvfb หยุด

init.dไฟล์ผมใช้ลักษณะเช่นนี้

#! / bin / ทุบตี

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
กรณี "$ 1" ใน
  เริ่มต้น)
    echo -n "การเริ่มต้นบัฟเฟอร์เฟรมเสมือนจริง: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    เสียงสะท้อน "."
    ;;
  หยุด)
    echo -n "การหยุดบัฟเฟอร์เฟรมเสมือนจริง: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    เสียงสะท้อน "."
    ;;
  เริ่มต้นใหม่)
    หยุด $ 0
    เริ่มต้น $ 0
    ;;
  *)
  echo "การใช้งาน: /etc/init.d/xvfb {start | stop | restart}"
  ทางออก 1
esac
ออก 0

ฉันทำสิ่งนี้แล้วเรียกใช้สคริปต์ของฉัน อย่างไรก็ตามฉันยังคงได้รับสิ่งนี้: ข้อผิดพลาด: ไม่สามารถเปิดการแสดงผล:: 0 นอกจากนี้ฉันต้องเรียกใช้เซิร์ฟเวอร์ selenium java หรือไม่ ดูเหมือนว่าจะไม่สำคัญว่าฉันจะวิ่งหรือไม่ ...
TIMEX

2
owalla ถ้าคุณใช้ WebDriver คุณก็ไม่จำเป็นต้องใช้ Selenium Java Server
Corey Goldberg

3

หากคุณใช้ Maven คุณสามารถใช้xvfb-maven-pluginเพื่อเริ่ม xvfb ก่อนการทดสอบเรียกใช้โดยใช้DISPLAYตัวแปรสภาพแวดล้อมที่เกี่ยวข้องและหยุด xvfb หลังจากทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.