Как мне запустить 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
больше (см. объяснение почему).