如何在Xvfb中运行Selenium?


91

我在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

2
如果您使用的系统没有运行X,则显示:0应该可用。尝试运行Xvfb:0-也请参见@ema提到的xvfb-run
fijiaaron 2012年

对于未来的追随者,我描述了我的Ubuntu Server解决方案:namekdev.net/2016/08/…–
Namek

Answers:


35

打开终端并运行此命令 xhost +。每次重新启动计算机时都需要运行此命令。如果一切正常,可以将其添加到启动命令中

还要确保在/ etc / environment文件中有一行

export DISPLAY=:0.0 

然后,运行测试以查看问题是否得到解决。

在使用此功能之前,请所有人注意以下来自sardathrion的评论。


您只需要从命令行执行java -jar selenium-server-standalone-2.0b3.jar,然后运行测试
AJ

我在EC2实例上,因此没有GUI。xhost:无法打开显示“:0.0”
TIMEX

@owa您还需要在客户端环境中使用DISPLAY环境变量。
基思

10
xhost +是不安全的。请不要使用它。如果必须使用xhost,请添加所需的特定计算机,而不要添加+(也可以是所有内容)。
Sardathrion-反对SE滥用

170

您可以使用PyVirtualDisplay(Xvfb的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.

2
@Andrei OSX默认不使用X11
sam boosalis 2012年

使用此答案可以使其在OS X上与vagrant + PyCharm + Django一起使用:stackoverflow.com/q/29343109
chachan 2015年

当我实现上面的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 2013年

9
DISPLAY=:1是不必要的;xvfb-run :99在启动指定命令(在您的情况下为)之前,将DISPLAY环境变量设置为其他值(通常为java -jar selenium-server...
Alex Dupuy 2014年

20

这是我使用的设置:

在运行测试之前,执行:

出口DISPLAY =:99
/etc/init.d/xvfb开始

经过测试:

/etc/init.d/xvfb停止

init.d我使用的文件如下所示:

#!/ bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS =“ $ DISPLAY -ac -screen 0 1024x768x16”
PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY:1} .pid
案例“ $ 1”在
  开始)
    echo -n“启动虚拟X帧缓冲区:Xvfb”
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB-$ XVFBARGS
    回显“。”
    ;;
  停)
    echo -n“停止虚拟X帧缓冲区:Xvfb”
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    回显“。”
    ;;
  重新开始)
    $ 0止损
    $ 0美元起
    ;;
  *)
  回声“用法:/etc/init.d/xvfb {开始|停止|重新启动}”
  1号出口
埃萨克
出口0

我正是这样做了,然后运行了我的脚本。但是,我仍然得到此:错误:无法打开显示::0。另外,我是否需要运行Selenium Java服务器?我是否运行它似乎都没有关系...
TIMEX

2
owalla,如果使用WebDriver,则不需要Selenium Java Server。
Corey Goldberg

3

如果使用Maven,则可以使用xvfb-maven-plugin在测试之前启动xvfb,使用相关的DISPLAY环境变量运行它们,并最终停止xvfb。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.