Как запустить селен в 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 [email protected]
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 [email protected]
Отлично, теперь все должно работать, верно?
Когда я запускаю свой код:
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
Ответы
Ответ 1
откройте терминал и запустите эту команду xhost +
. Эти команды должны запускаться каждый раз при перезагрузке вашего компьютера. Если все работает нормально, вы можете добавить это в команды запуска
Также убедитесь, что в файле /etc/environment есть строка
export DISPLAY=:0.0
И затем запустите свои тесты, чтобы узнать, разрешена ли ваша проблема.
Пожалуйста, обратите внимание на комментарий от sardathrion ниже, прежде чем использовать это.
Ответ 2
Вы можете использовать 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.
Ответ 3
Самый простой способ - использовать xvfb-run:
DISPLAY=:1 xvfb-run java -jar selenium-server-standalone-2.0b3.jar
xvfb-run делает для вас всю власть X, дайте ей попробовать!
Ответ 4
Это настройка, которую я использую:
Перед запуском тестов выполните:
export 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" 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)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
exit 1
esac
exit 0
Ответ 5
Если вы используете Maven, вы можете использовать xvfb-maven-plugin для запуска xvfb перед тестированием, запустить их с помощью связанной переменной среды DISPLAY
и stop xvfb в конце концов.
Ответ 6
В моем случае на CentOS 7:
пакеты:
PIP_PACKAGES="selenium pyvirtualdisplay"
YUM_PACKAGES="python34-pip httpd firefox xorg-x11-server-Xvfb expect python34-paramiko"
дисплей:
su --command="Xvfb :22 -screen 0 1024x768x16 > /dev/null 2>&1 &" root
export DISPLAY=:22
простой тест:
#!/usr/bin/env python3
from selenium import webdriver
from pyvirtualdisplay import Display
browser = webdriver.Firefox()
browser.get('https://google.com')
if "Google" in browser.title:
print(browser.title)