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

Я нахожусь на экземпляре EC2. Так что нет графического интерфейса.

$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

6 ответов

Решение

Откройте терминал и выполните эту команду 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 для вас, попробуйте!

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

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

экспорт DISPLAY=:99
/etc/init.d/xvfb start

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

/etc/init.d/xvfb stop

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

#! / Bin / Баш

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
    эхо ".";;
  стоп)
    echo -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 в конце концов.

Правильный способ:

      xvfb-run python ./selenium-script.py

Не нужно добавлять:

      from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
display.stop()

Но теперь, с Selenium WebDriver, нет необходимости запускать еще иxvfbбольше (см. объяснение почему).

Другие вопросы по тегам