Как запустить Selenium в Xvfb?


Я на экземпляре 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
5 79

5 ответов:

откройте терминал и выполните следующую команду xhost +. Эти команды должны выполняться каждый раз при перезагрузке компьютера. Если все работает нормально, возможно, вы можете добавить это в команды запуска

также убедитесь, что в вашем файле/etc / environment есть строка

export DISPLAY=:0.0 

а затем запустите тесты, чтобы увидеть, если ваша проблема решена.

все Пожалуйста, обратите внимание на комментарий от sardathrion ниже, прежде чем использовать это.

можно использовать PyVirtualDisplay (оболочка Python для Xvfb) для запуска тестов безголового 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 авторитет танец для вас, дайте ему попробовать!

это настройка, которую я использую:

перед запуском тестов, выполнить:

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

и после испытаний:

/etc/init.d/xvfb stop

The init.d файл, который я использую выглядит так:

#!/bin/bash

XVFB=/usr/bin/Xvfb
XVFBARGS="$DISPLAY -ac -screen 0 1024x768x16"
PIDFILE=${HOME}/xvfb_${DISPLAY:1}.pid
case "" 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)
     stop
     start
    ;;
  *)
  echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
  exit 1
esac
exit 0

Если вы используете Maven, вы можете использовать xvfb-maven-plugin чтобы запустить xvfb перед тестами, запустите их с помощью related DISPLAY переменные среды, и остановить xvfb в конце концов.