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 搭建自动化测试环境

selenium实现Xvfb在linux上无界面运行

Python + Selenium2 + Chrome 爬取网页

selenium+php-webdriver实现抓取淘宝页面

nohup、&、disown、setsid、screen、jobs 后台运行命令区别