无GUI的CentOS上使用Selenium+Chrome

客户的网站上的监测代码最近连续两次在网站更新时被清除掉,导致无法正常获取网站访问数据,影响到后续大数据分析。

为解决这个问题,决定使用Python Selenium模块来实现网站按钮模拟点击,同时监测我们后台是否能正常收到,以此来判断网站按钮监测代码是否有正常部署。

Selenium很好用很强大,开发和部署也都很简单,是自动化测试非常好的工具,但是问题是我们需要在无GUI的服务器上进行部署,这就牵涉到在无GUI的服务器上安装浏览器的问题,我这里选择的是Chrome。


下面简单分享一个部署过程中遇到的坑,也当作是总结。

一、安装Chromium

1
2
yum install -y epel-release
yum install -y chromium

检测安装结果

1
2
3
# ll /usr/bin/ | grep chrom
-rwxr-xr-x. 1 root root 8136192 Jun 7 17:02 chromedriver
lrwxrwxrwx. 1 root root 47 Aug 6 16:51 chromium -> /usr/lib64/chromium-browser/chromium-browser.sh

二、安装XVFB

XVFB全称为:virtual framebuffer X server for X Version 11,可以直接处理Windows的图形化功能,并且不会把图像输出到屏幕上,也就是说,就算你的电脑没有启动Xwindow,也依然也可以执行图形化软件。

1
yum install xorg-x11-fonts* Xvfb -y

三、编写浏览器启动脚本

利用xvfb来启动Chromium,并设置参数

vim /usr/bin/xvfb-chromium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

_kill_procs() {
kill -TERM $chromium
wait $chromium
kill -TERM $xvfb
}

# Setup a trap to catch SIGTERM and relay it to child processes
trap _kill_procs SIGTERM

XVFB_WHD=${XVFB_WHD:-1280x720x16}

# Start Xvfb
Xvfb :99 -ac -screen 0 $XVFB_WHD -nolisten tcp &
xvfb=$!

export DISPLAY=:99

chromium --no-sandbox --disable-dev-shm-usage --headless --disable-gp $@ &
chromium=$!

wait $chromium
wait $xvfb

以上代码参考:https://github.com/mark-adams/docker-chromium-xvfb/blob/master/images/base/xvfb-chromium ,修改了第20行,添加了三个参数预防一些异常报错

为脚本添加可执行权限

1
chmod +x /usr/bin/xvfb-chromium

四、更改链接,调整命令

1
2
3
4
ln -s /usr/lib64/chromium-browser/chromium-browser.sh /usr/bin/chromium
rm -rf /usr/bin/chromium-browser
ln -s /usr/bin/xvfb-chromium /usr/bin/chromium-browser
ln -s /usr/bin/xvfb-chromium /usr/bin/google-chrome

检测调整结果,显示如下所示,即表示正确

1
2
3
4
5
6
# ll /usr/bin/ | grep chrom*
-rwxr-xr-x. 1 root root 8136192 Jun 7 17:02 chromedriver
lrwxrwxrwx. 1 root root 47 Aug 6 16:51 chromium -> /usr/lib64/chromium-browser/chromium-browser.sh
lrwxrwxrwx. 1 root root 22 Aug 6 16:51 chromium-browser -> /usr/bin/xvfb-chromium
lrwxrwxrwx. 1 root root 22 Aug 6 16:51 google-chrome -> /usr/bin/xvfb-chromium
-rwxr-xr-x. 1 root root 422 Aug 7 10:37 xvfb-chromium

参考:https://hub.docker.com/r/markadams/chromium-xvfb/~/dockerfile/

五、遇到的问题

最学见的报错:

selenium.common.exceptions.WebDriverException: Message: unknown error: DevToolsActivePort file doesn't exist

这个报错由两个原因导致
第一个是原因是参数设置问题,可直接添加相关参数即可
在Python代码中添加:

1
2
3
4
5
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('/path/to/your_chrome_driver_dir/chromedriver',chrome_options=chrome_options)

参考:https://github.com/heroku/heroku-buildpack-google-chrome/issues/46

或者把上述参数添加在本文每三步的脚本中

另一个会导致这个报错的原因是在编写完第三的步脚本/usr/bin/xvfb-chromium后没有给其赋予可执行权限把致。