【问题标题】:How do I run Selenium in Xvfb?如何在 Xvfb 中运行 Selenium?
【发布时间】:2011-09-05 05:05:15
【问题描述】:

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

【问题讨论】:

  • 如果您的系统没有运行 X,则 display :0 应该可用。尝试运行 Xvfb :0 - 另请参阅@ema 提到的 xvfb-run
  • 对于未来的追随者,我描述了我的 Ubuntu Server 解决方案:namekdev.net/2016/08/…

标签: python linux user-interface unix selenium


【解决方案1】:

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

【讨论】:

  • @Andrei OSX 默认不使用 X11
  • 使用此答案使其在 OS X 上与 vagrant + PyCharm + Django 一起使用:stackoverflow.com/q/29343109
  • 当我实现上面的 pyvirtualdisplay 代码时,我得到一个“浏览器似乎已经退出”
【解决方案2】:

最简单的方法大概是使用xvfb-run:

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

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

【讨论】:

  • 这正是我想要的。自己启动 Xvfb 似乎对我不起作用,但使用 xvfb-run 就可以了。谢谢。
  • DISPLAY=:1 是不必要的; xvfb-run 在启动指定命令(在您的情况下为java -jar selenium-server...)之前将 DISPLAY 环境变量设置为其他值(通常为:99
【解决方案3】:

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

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

export DISPLAY=:0.0 

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

在使用此之前,请注意下面来自 sardathrion 的评论。

【讨论】:

  • 你只需要从命令行执行 java -jar selenium-server-standalone-2.0b3.jar 然后运行你的测试
  • 我在 EC2 实例上,所以没有 GUI。 xhost:无法打开显示“:0.0”
  • @owa 你还需要客户端环境中的 DISPLAY 环境变量。
  • xhost + 不安全。请不要使用它。如果您必须使用 xhost,请添加您想要的特定机器,而不是 +(也就是任何东西)。
【解决方案4】:

这是我使用的设置:

在运行测试之前,执行:

导出显示=: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 开始
    ;;
  *)
  echo "用法:/etc/init.d/xvfb {start|stop|restart}"
  1号出口
经社理事会
0号出口

【讨论】:

  • 我就是这样做的,然后运行我的脚本。但是,我仍然得到这个:错误:无法打开显示::0。另外,我需要运行 selenium java 服务器吗?看来我跑不跑都无所谓了……
  • owala,如果您使用 WebDriver,则不需要 Selenium Java Server。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2018-02-15
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多