Xvfb、DISPLAY、selenium、webdriver、firefox、chrome
selenium在 Linux 上无界面运行,其实是非常简单的。
具体的方法有使用HtmlUnitDriver或者PhantomJSDriver,和ChromeDriver 和FirefoxDriver是一样的。但是有些人或者会比较排斥他们说HtmlUnitDriver对JS支持不好,PhantomJSDriver估计也很少有人用,其实他是对Phantomjs的封装,对这些不做多过评论,我用下来感觉还好。
还有另一种方法,就是使用XVFB, 有人说XVFB是什么
Xvfb 是通过提供一个类似 X server 守护进程和设置程序运行的环境变量
DISPLAY 来提供程序运行的环境
Xvfb是一个实现了X11显示服务协议的显示服务器。 不同于其他显示服务器,Xvfb在内存中执行所有的图形操作,不需要借助任何显示设备。
目前的测试机没有图形界面,我们可以安装Xvfb,然后执行依赖于图形界面的测试,比如webdriver case。
1)安装 Xvfb
yum install -y Xvfb
2)启动 Xvfb
Xvfb -ac :7 -screen 0 1280x1024x8
3)启动 firefox or chrome
export DISPLAY=:7 (和上一步的number号相同)
firefox https://mimvp.com
可以忽略如下错误: Xlib: extension "RANDR" missing on display ":7".
DISPLAY用来设置将图形显示到何处,如上例为 使用unix socket方式连接到本机(/tmp/.X11-unix/X7)。 DISPLAY环境变量格式如下host:NumA.NumB, host指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, XManager等Windows平台运行的Xserver的Windows机器. 假如Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式. 使用TCP方式连接时, NumA为连接的端口减去6000的值, 假如NumA为0, 则表示连接到6000端口; 使用unix socket方式连接时则表示连接的unix socket的路径, 假如为0, 则表示连接到/tmp/.X11-unix/X0 . NumB则几乎总是0.
通过python运行webdriver的case之前,首先要安装python环境及测试需要的module。
4. 下载pip的安装文件get-pip.py: /home/bi_test
5. root运行: python get-pip.py
6. 安装测试需要的依赖模块:pip install "module name"
7. 运行如下简单的测试case:
# coding = utf-8 from selenium import webdriver browser = webdriver.Firefox() browser.get("http://www.baidu.com") browser.save_screenshot("capture.png"); browser.quit()
这里就主要是讲一下XVFB的安装使用。以chrome + ubuntu 和 firefox + centOS 为例子(chrome linux版好像是到6的时候就不支持centOS了, 都自带firefox )
一、 XVFB在Ubuntu上的安装(chrome)
1. 安装ubuntu(百度google安装步骤)
2. putty.exe 连接ubuntu
安装openssh-server:sudo apt-get install openssh-server
启动openssh-server: sudo /etc/init.d/ssh start
确认openssh-server是否启动:ps -e | grep ssh
telnet ip 端口号
3. 安装oracle JDK6:(可跳过:自带penjdk-6-jre)
$ remove openjdk: sudo apt-get autoremove openjdk-6-jre
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java6-installer
$ sudo update-java-alternatives -s java-6-oracle
4. 装chrome:(自带firefox)
http://www.ubuntuupdates.org/ppa/google_chrome
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt-get update
sudo apt-get install google-chrome-stable
5. 装xvfb 及各种:
sudo apt-get update && sudo apt-get install -y xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic xvfb x11-apps imagemagick firefox google-chrome-stable
OK, 到这一步都装好了。
二、测试安装
putty连接Ubuntu运行下面命令:
1. 启动Xvfb服务
Xvfb -ac :7 -screen 0 1280x1024x8 (注意这个是x, 不是* 哦)
2. 启动firefox or chrome
export DISPLAY=:7
/usr/bin/google-chrome-stable http://www.investopedia.com //chrome 浏览www.investopedia.com
或者
export DISPLAY=:7
firefox https://www.mimvp.com //firefox 浏览www.investopedia.com
如果运行完后,出现:
Xlib: extension "RANDR" missing on display ":7"
我想说,you made it. 这是个无关紧要的信息,之前我试图解决掉它,没有成功。最后我在运行selenium脚本后,完全没有出现这个信息,脚本执行很正常,所以现在我把它当做是安装成功的信息。
当然运行selenium 脚本前总不能老是敲一遍这些命令,太麻烦了。
弄成一个服务,先 touch /etc/init.d/xvfb
脚本如下:
#! /bin/bash if [ -z "$1" ]; then echo "`basename $0` {start|stop}" exit fi case "$1" in start) /usr/bin/Xvfb :7 -ac -screen 0 1280x1024x8 & ;; stop) killall Xvfb ;; esac
修改脚本权限,启动服务:
chmod +x /etc/init.d/xvfb
chkconfig xvfb on
service xvfb start
三、Xvfb在CentsOS安装
Install Xvfb with library: yum install Xvfb yum -y install libXfont yum install xorg-x11-fonts* touch /etc/init.d/xvfb with content: #!/bin/bash # # /etc/rc.d/init.d/xvfbd # # chkconfig: 345 95 28 # description: Starts/Stops X Virtual Framebuffer server # processname: Xvfb # . /etc/init.d/functions [ "${NETWORKING}" = "no" ] && exit 0 PROG="Xvfb" PROG_OPTIONS=":7 -ac -screen 0 1024x768x24" PROG_OUTPUT="/tmp/Xvfb.out" case "$1" in start) echo -n "Starting : X Virtual Frame Buffer " $PROG $PROG_OPTIONS>>$PROG_OUTPUT 2>&1 & disown -ar /bin/usleep 500000 status Xvfb & >/dev/null && echo_success || echo_failure RETVAL=$? if [ $RETVAL -eq 0 ]; then /bin/touch /var/lock/subsys/Xvfb /sbin/pidof -o %PPID -x Xvfb > /var/run/Xvfb.pid fi echo ;; stop) echo -n "Shutting down : X Virtual Frame Buffer" killproc $PROG RETVAL=$? [ $RETVAL -eq 0 ] && /bin/rm -f /var/lock/subsys/Xvfb /var/run/Xvfb.pid echo ;; restart|reload) $0 stop $0 start RETVAL=$? ;; status) status Xvfb RETVAL=$? ;; *) echo $"Usage: $0 (start|stop|restart|reload|status)" exit 1 esac exit $RETVAL Registering in system and start: chmod +x /etc/init.d/xvfb chkconfig xvfb on service xvfb start now export DISPLAY=:7 (actually you should add this to your etc/bashrc)
米扑实践与总结
PHP + Selenium + WebDriver 抓取米扑科技首页https://github.com/facebook/php-webdriver https://stackoverflow.com/questions/24653127/selenium-error-no-display-specified# http://127.0.0.1:8888/wd/hub You receive this error, because you have not set the DISPLAY variable. Here is a guide how to perform the test on a headless machine. You have to install Xvfb and a browser first: apt-get install xvfb apt-get install firefox-mozilla-build then start Xvfb: Xvfb & set DISPLAY and start Selenium: export DISPLAY=localhost:0.0 java -jar selenium-server-standalone-2.44.0.jar and then you will be able to run your tests. --------------------- http://jarvi.iteye.com/blog/2191755 sudo apt-get update sudo apt-get install xvfb firefox google-chrome-stable sudo apt-get install -y xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps imagemagick Xvfb -ac :7 -screen 0 1280x1024x8 export DISPLAY=:7 /usr/bin/google-chrome-stable https://mimvp.com export DISPLAY=:7 firefox https://mimvp.com
参考推荐:
PHP + Selenium + WebDriver 抓取米扑科技首页
Python + Selenium2 + Chrome 爬取网页
selenium+php-webdriver实现抓取淘宝页面
nohup、&、disown、setsid、screen、jobs 后台运行命令区别
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2020-12-02 15:20:01
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!