Как запустить Selenium в 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 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
5 ответов:
откройте терминал и выполните следующую команду
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 авторитет танец для вас, дайте ему попробовать!
это настройка, которую я использую:
перед запуском тестов, выполнить:
export DISPLAY=:99 /etc/init.d/xvfb startи после испытаний:
/etc/init.d/xvfb stopThe
init.d
файл, который я использую выглядит так:#!/bin/bash XVFB=/usr/bin/Xvfb XVFBARGS="$DISPLAY -ac -screen 0 1024x768x16" PIDFILE=${HOME}/xvfb_${DISPLAY:1}.pid case "" 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) stop start ;; *) echo "Usage: /etc/init.d/xvfb {start|stop|restart}" exit 1 esac exit 0
Если вы используете Maven, вы можете использовать xvfb-maven-plugin чтобы запустить xvfb перед тестами, запустите их с помощью related
DISPLAY
переменные среды, и остановить xvfb в конце концов.