如何在Xvfb中运行Selenium?

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

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

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

 export DISPLAY=:0.0 

然后,运行您的测试,看看您的问题是否已经解决。

所有请在使用之前注意以下sardathrion的评论。

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

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

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

xvfb-run会让整个X权威为你跳舞,试试吧!

这是我使用的设置:

在运行测试之前,执行:

 导出DISPLAY =:99
 /etc/init.d/xvfb启动

经过测试:

  /etc/init.d/xvfb停止 

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

  #!/斌/庆典

 XVFB =的/ usr /斌/的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
    回声“。
     ;;
  停止)
    回声-n“停止虚拟X帧缓冲区:Xvfb”
     / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    回声“。
     ;;
  重新开始)
     $ 0停止
     $ 0开始
     ;;
   *)
   echo“用法:/etc/init.d/xvfb {start | stop | restart}”
  出口1
 ESAC
退出0 

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

以我的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)