如何在Xvfb中运行Selenium?

TIM*_*MEX 89 python unix linux user-interface selenium

我在EC2实例上.所以没有GUI.

$pip install selenium
$sudo apt-get install firefox xvfb
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

$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
Run Code Online (Sandbox Code Playgroud)

好的,现在一切都应该有效,对吧?

当我运行我的代码时:

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") 
Run Code Online (Sandbox Code Playgroud)

我明白了:

Error: cannot open display: :0
Run Code Online (Sandbox Code Playgroud)

Cor*_*erg 166

您可以使用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()
Run Code Online (Sandbox Code Playgroud)

更多信息


您也可以使用xvfbwrapper,它是一个类似的模块(但没有外部依赖项):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()
Run Code Online (Sandbox Code Playgroud)

或者更好的是,将它用作上下文管理器:

from xvfbwrapper import Xvfb

with Xvfb() as xvfb:
    # launch stuff inside virtual display here.
    # It starts/stops in this code block.
Run Code Online (Sandbox Code Playgroud)

  • @Andrei OSX默认不使用X11 (2认同)

ema*_*ema 45

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

DISPLAY=:1 xvfb-run java -jar selenium-server-standalone-2.0b3.jar
Run Code Online (Sandbox Code Playgroud)

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

  • "DISPLAY =:1``是不必要的; xvfb-run在启动指定命令之前将DISPLAY环境变量设置为其他东西(通常是``:99``)(在你的情况下,``java -jar selenium-server ...``) (8认同)

A.J*_*A.J 34

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

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

export DISPLAY=:0.0 
Run Code Online (Sandbox Code Playgroud)

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

在使用之前请注意以下sardathrion的评论.

  • `xhost +`是不安全的.请不要使用它.如果你必须使用xhost,添加你想要的特定机器而不是+(也就是所有的东西). (10认同)

sha*_*ang 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

  • owalla,如果你使用WebDriver,那么你不需要Selenium Java Server. (2认同)