selenium+python

桌面环境使用Selenium默认会打开浏览器界面,但是如果要部署在无桌面环境的服务器环境,使用普通方法没法运行Selenium。

在服务器环境安装Gnome或者其他桌面环境,比较占用资源。

可以通过安装虚拟桌面环境解决这个问题。

Xvfb(X virtual framebuffer)是一个虚拟显示服务器,不需要显示设备也能模拟运行图形界面。

系统要求

  • CentOS 7
  • Firefox 56.0+
  • Selenium 3.5+
  • geckodriver 0.19+

安装

  1. 安装Xvfb及其他依赖

    yum install xorg-x11-server-Xvfb bzip gtk3

  2. 安装火狐

    CentOS源里的火狐版本为52.3.0 ESR延长支持版,版本较老,和最新的Selenium版本不兼容,可能会启动不了。从官方下载56.0以上的版本。

    1
    2
    3
    4
    
    cd /usr/local
    wget https://ftp.mozilla.org/pub/firefox/releases/56.0.2/linux-x86_64/en-US/firefox-56.0.2.tar.bz2
    tar xjvf firefox-56.0.2.tar.bz2
    ln -s /usr/local/firefox/firefox /usr/bin/firefox
    1. 安装Selenium

    pip install selenium

    1. 安装火狐驱动

    最新版本下载地址:https://github.com/mozilla/geckodriver/releases

    1
    2
    3
    4
    
    cd /usr/local/bin
    wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
    tar xvzf geckodriver-*.tar.gz
    ln -s /usr/local/geckodriver /usr/bin/geckodriver

运行

  1. 启动虚拟桌面环境,保持后台运行

    Xvfb :1 -screen 0 1024x768x24 &

    :1是服务启动的端口号,可以任意设置,与下一步保持一致就行

  2. 配置环境变量

    export DISPLAY=:1

    端口号和上面一致,冒号不能漏

  3. 启动程序测试

    1
    2
    3
    4
    5
    6
    
    from selenium import webdriver
    
    b = webdriver.Firefox()
    b.get('http://www.baidu.com')
    print b.page_source
    b.quit()

    其他问题

    1. 运行webdriver.Firefox()后等待很久报错并退出,显示selenium.common.exceptions.WebDriverException: Message: other os error:可能是版本不兼容,可以把firefox,geckodriver以及selenium全部升级到新版本

    2. 启动不了火狐,显示Error: GDK_BACKEND does not match available displays错误:检查是否运行Xvfb,是否配置环境变量,端口号是否一致

      1
      2
      
      ps -aux | grep Xvfb
      echo $DISPLAY