如何在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
文件如下所示:
#!/斌/庆典 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 回声“。 ;; 停止) 回声-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。
以我的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)