2011-05-31 75 views
74

我在EC2实例。所以没有GUI。如何在Xvfb中运行Selenium?

$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 [email protected] 
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 [email protected] 

大,一切都应该现在的工作,对不对?

当我运行我的代码:

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 - 另请参阅xvfb-run,如@ema所述 – fijiaaron 2012-10-25 12:48:39

+0

对于未来的关注者,我描述了Ubuntu服务器的解决方案:https://www.namekdev.net/2016/08/selenium-server-without- x-window-system-xvfb/ – Namek 2016-08-05 11:11:21

回答

30

打开终端,运行此命令xhost +。每次重新启动机器时都需要运行这些命令。如果一切正常,可能是你可以将它添加到启动命令

另外,还要确保在/ etc/environment文件中有一条线

export DISPLAY=:0.0 

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

使用前请注意以下sardathrion的评论。

+0

您只需要从命令行执行java -jar selenium-server-standalone-2.0b3.jar然后运行测试 – 2011-05-31 05:35:03

+0

我在EC2实例中,因此没有GUI。 xhost:无法打开显示“:0.0” – TIMEX 2011-05-31 05:38:15

+0

@owa您还需要客户端环境中的DISPLAY环境变量。 – Keith 2011-05-31 11:13:58

20

这是我使用的设置:

之前运行测试,执行:

export DISPLAY=:99 
/etc/init.d/xvfb start 

而且试验后:

/etc/init.d/xvfb stop

init.d文件我用的是这样的:

#!/bin/bash 

XVFB=/usr/bin/Xvfb 
XVFBARGS="$DISPLAY -ac -screen 0 1024x768x16" 
PIDFILE=${HOME}/xvfb_${DISPLAY:1}.pid 
case "$1" in 
    start) 
    echo -n "Starting virtual X frame buffer: Xvfb" 
    /sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS 
    echo "." 
    ;; 
    stop) 
    echo -n "Stopping virtual X frame buffer: Xvfb" 
    /sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE 
    echo "." 
    ;; 
    restart) 
    $0 stop 
    $0 start 
    ;; 
    *) 
    echo "Usage: /etc/init.d/xvfb {start|stop|restart}" 
    exit 1 
esac 
exit 0
+0

我做了这个,然后运行我的脚本。但是,我仍然得到这个:错误:无法打开显示器:: 0。另外,我是否需要运行selenium java服务器?这似乎没关系,如果我运行它或不... – TIMEX 2011-05-31 21:11:25

+2

owalla,如果您使用WebDriver,那么你不需要Selenium Java服务器。 – 2011-06-10 00:11:58

146

您可以使用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() 

more info


您还可以使用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. 
+4

这确实显示了OSX上的浏览器10.7.4 – Andrei 2012-07-10 18:03:43

+2

@Andrei OSX默认情况下不使用X11 – 2012-07-21 19:50:05

+0

使用此答案可以在OS X上使用vagrant + PyCharm + Django:http://stackoverflow.com/q/ 29343109 – chachan 2015-03-30 10:44:33

42

最简单的方法可能是使用xvfb的运行:

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

xvfb的运行并为您的整个X权威的舞蹈,不妨一试!

+0

以上实现pyvirtualdisplay代码时,我得到一个“浏览器似乎退出”这就是我正在寻找的。自己启动Xvfb似乎不适用于我,但使用xvfb-run的确有效。谢谢。 – 2013-08-29 20:58:04

+8

''DISPLAY =:1''是不必要的; xvfb-run在开始指定的命令之前将DISPLAY环境变量设置为别的东西(通常是'':99'')(在你的情况下,''java -jar selenium-server ...'') – 2014-11-13 15:36:06

3

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

0

在我的情况在CentOS 7:

软件包:

PIP_PACKAGES="selenium pyvirtualdisplay" 
YUM_PACKAGES="python34-pip httpd firefox xorg-x11-server-Xvfb expect python34-paramiko" 

显示:

su --command="Xvfb :22 -screen 0 1024x768x16 > /dev/null 2>&1 &" root 
export DISPLAY=:22 

简单的测试:

#!/usr/bin/env python3 

from selenium import webdriver 
from pyvirtualdisplay import Display 

browser = webdriver.Firefox() 
browser.get('https://google.com') 
if "Google" in browser.title: 
    print(browser.title)