Як запустити селен у Xvfb?


92

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

2
Якщо ви працюєте в системі без запуску X, дисплей: 0 повинен бути доступний. Спробуйте запустити Xvfb: 0 - також див. Xvfb-run, як згадував @ema
fijiaaron

Для майбутніх послідовників я описав своє рішення для сервера Ubuntu: namekdev.net/2016/08/…
Namek

Відповіді:


35

відкрийте термінал і запустіть цю команду xhost + . Ці команди потрібно запускати кожного разу, коли ви перезавантажуєте машину. Якщо все працює нормально, можливо, ви можете додати це до команд запуску

Також переконайтеся, що у вашому файлі / etc / environment є рядок

export DISPLAY=:0.0 

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

Всі, будь ласка, зверніть увагу на коментар від sardathrion нижче, перш ніж використовувати це.


Вам просто потрібно виконати java -jar selenium-server-standalone-2.0b3.jar з командного рядка, а потім запустити тести
AJ

Я на екземплярі EC2, тому графічного інтерфейсу немає. xhost: не вдається відкрити дисплей ": 0.0"
TIMEX

@owa Вам також потрібна змінна середовища DISPLAY у клієнтському середовищі.
Кіт,

10
xhost +є небезпечним. Будь ласка, не використовуйте його. Якщо вам потрібно використовувати xhost, додайте потрібну машину, а не + (а саме все, що завгодно).
Сардатріон - проти зловживань SE

170

Ви можете використовувати 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

Використовується ця відповідь, щоб він працював з волоцюгою + PyCharm + Джанго на OS X: stackoverflow.com/q/29343109
чача

Я отримую "браузер, здається, вийшов", коли я реалізую код pyvirtualdisplay вище
gtownrower

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

Це настройка, яку я використовую:

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

експортувати ДИСПЛЕЙ =: 99
/etc/init.d/xvfb start

А після тестів:

/etc/init.d/xvfb зупинка

У init.dвикористанні файлу я виглядає наступним чином :

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {ДИСПЛЕЙ: 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 {запуск | зупинка | перезапуск}"
  вихід 1
esac
вихід 0

Я зробив саме це, а потім запустив свій сценарій. Однак я все ще отримую таке: Помилка: не вдається відкрити дисплей:: 0. Крім того, чи потрібно мені запускати сервер selenium java? Здається, неважливо, керую я чи ні ...
TIMEX

2
owalla, якщо ви використовуєте WebDriver, то вам не потрібен Selenium Java Server.
Кори Голдберг

3

Якщо ви використовуєте Maven, ви можете використовувати xvfb-maven-plugin, щоб запустити xvfb перед тестами, запустити їх, використовуючи відповідну DISPLAYзмінну середовища, і врешті-решт зупинити xvfb.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.