web-dev-qa-db-ja.com

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
87
TIMEX

ターミナルを開き、このコマンドを実行しますxhost +。このコマンドは、マシンを再起動するたびに実行する必要があります。すべてが正常に機能する場合は、これをスタートアップコマンドに追加できます。

また、/ etc/environmentファイルに次の行があることを確認してください。

export DISPLAY=:0.0 

次に、テストを実行して、問題が解決したかどうかを確認します。

これを使用する前に、以下のsardathrionからのコメントに注意してください。

33
A.J

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.
162
Corey Goldberg

最も簡単な方法は、おそらくxvfb-runを使用することです。

DISPLAY=:1 xvfb-run Java -jar Selenium-server-standalone-2.0b3.jar

xvfb-runは、Xオーソリティ全体をあなたのために踊り、試してみます!

44
ema

これは私が使用するセットアップです:

テストを実行する前に、次を実行します。

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 "仮想Xフレームバッファーの開始:Xvfb" 
/sbin/start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB-$ XVFBARGS 
 echo "。" 
 ;; 
 stop)
 echo -n "仮想Xフレームバッファーの停止:Xvfb" 
/sbin/start-stop-daemon --stop --quiet --pidfile $ PIDFILE 
 echo "。" 
 ;; 
 restart)
 $ 0 stop 
 $ 0 start 
 ;; 
 *)
 echo "使用法:/etc/init.d/xvfb {start | stop | restart}" 
 exit 1 
 esac 
 exit 0
20
shang

Mavenを使用する場合、 xvfb-maven-plugin を使用して、テストの前にxvfbを起動し、関連するDISPLAY環境変数を使用して実行し、結局xvfbを停止できます。

3
Toilal