[python] Xvfb에서 Selenium을 어떻게 실행합니까?

저는 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



답변

터미널을 열고이 명령을 실행하십시오 xhost +. 이 명령은 컴퓨터를 다시 시작할 때마다 실행해야합니다. 모든 것이 잘 작동하면 시작 명령에 이것을 추가 할 수 있습니다.

또한 / etc / environment 파일에 행이 있는지 확인하십시오.

export DISPLAY=:0.0 

그런 다음 테스트를 실행하여 문제가 해결되었는지 확인하십시오.

모두 이것을 사용하기 전에 아래 sardathrion의 주석을 참고하십시오.


답변

PyVirtualDisplay (Xvfb 용 Python 래퍼)를 사용하여 헤드리스 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 시작

그리고 테스트 후 :

/etc/init.d/xvfb 중지

init.d내가 사용 하는 파일은 다음과 같습니다.

#! / bin / bash

XVFB = / usr / bin / 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를 중지 할 수 있습니다.


답변