如何在Xvfb中运行Selenium?
我在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的评论。