如何在Xvfb中运行Selenium?

100 投票
6 回答
123043 浏览
提问于 2025-04-16 18:39

我在EC2实例上,所以没有图形界面。

$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

6 个回答

46

最简单的方法可能就是使用 xvfb-run:

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

xvfb-run 会为你处理所有与 X 权限相关的事情,试试看吧!

183

你可以使用 PyVirtualDisplay 这个工具,它是一个用Python写的可以让你在没有显示器的情况下运行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.
37

打开一个终端窗口,然后输入这个命令 xhost +。每次你重启电脑的时候都需要运行这个命令。如果一切正常的话,你可以考虑把这个命令加到开机启动项里。

另外,确保在你的 /etc/environment 文件里有一行内容:

export DISPLAY=:0.0 

然后,运行你的测试,看看问题是否解决了。

大家在使用之前,请注意下面sardathrion的评论。

撰写回答