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

93

Я использую экземпляр 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
TIMEX
источник
3
Если вы работаете в системе без X, должно быть доступно отображение: 0. Попробуйте запустить Xvfb: 0 - также см. Xvfb-run, как упомянул @ema
fijiaaron
1
Для будущих последователей я описал свое решение для Ubuntu Server: namekdev.net/2016/08/…
Namek

Ответы:

35

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

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

export DISPLAY=:0.0 

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

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

AJ
источник
Вам просто нужно выполнить java -jar selenium-server-standalone-2.0b3.jar из командной строки, а затем запустить свои тесты
AJ
Я использую экземпляр EC2, поэтому графического интерфейса нет. xhost: невозможно открыть дисплей ": 0.0"
TIMEX,
@owa Вам также понадобится переменная среды DISPLAY в среде клиента.
Кейт
10
xhost +небезопасно. Пожалуйста, не используйте это. Если вам нужно использовать xhost, добавьте конкретную машину, которую вы хотите, а не + (также как и все).
Сардатрион - против злоупотреблений SE
171

Вы можете использовать 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.
Кори Голдберг
источник
2
@Andrei OSX не использует X11 по умолчанию
sam boosalis
Использовал этот ответ, чтобы заставить его работать с vagrant + PyCharm + Django в OS X: stackoverflow.com/q/29343109
chachan
Когда я реализую приведенный выше код
pyvirtualdisplay,
45

Самый простой способ - использовать xvfb-run:

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

xvfb-run танцует за вас весь авторитет X, попробуйте!

Эма
источник
Это как раз то, что я искал. Запуск Xvfb сам по себе, похоже, не сработал для меня, но использование xvfb-run помогло. Спасибо.
Рейна Аболофия
9
Это DISPLAY=:1не нужно; xvfb-run устанавливает переменную среды DISPLAY на что-то еще (обычно :99) перед запуском указанной команды (в вашем случае java -jar selenium-server...)
Alex Dupuy
20

Я использую такую ​​установку:

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

экспорт 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" в
  Начало)
    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
шанг
источник
Я сделал именно это, а затем запустил свой сценарий. Однако я все еще получаю это: Ошибка: не удается открыть дисплей:: 0. Кроме того, нужно ли запускать Java-сервер Selenium? Кажется, не имеет значения, запустил я его или нет ...
TIMEX
2
owalla, если вы используете WebDriver, то вам не нужен Selenium Java Server.
Кори Голдберг
3

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

Тойлал
источник