配置环境
- Alpine Linux 3.4
安装依赖
设置软件安装源
1 | $ echo "http://dl-4.alpinelinux.org/alpine/v3.4/main" >> /etc/apk/repositories |
安装依赖包
执行以下命令:
1 | $ apk update |
支持的浏览器及 WebDriver 驱动
这里我以常用的Chrome 和 Firefox 为例,来配置运行环境。
Selenium调用Chrome浏览器
Alpine系统下面使用Chrome推荐安装开源的 Chromium 浏览器
安装 Chromium
因为在软件库中存在 Chromium
的包,所以可以直接通过 apk
来安装:
1 | $ apk add chromium |
然后还要安装 chromium 的依赖包:
1 | $ apk add libexif udev |
如果没有安装 libexif
udev
这两个依赖包,会报如下错误,Chromium浏览器会无法启动:
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed
上面命令执行完成后,chromium 浏览器就安装好了。可以通过命令 chromium-browser
来测试:
1 | $ chromium-browser |
因为在 Server 系统下没有显示窗口,提示上面的信息说明 chromium 程序可以调用的到,只是无法显示。
安装 ChromeDriver
ChromeDriver是一个实现了WebDriver与Chromium联接协议的独立服务。
通过 apk 安装
我们可以直接通过如下命令来安装 chromedriver
程序:
1 | $ apk add chromium-chromedriver |
测试 ChromeDriver
执行 chromedriver
查看是否能正常运行。
1 | $ chromedriver |
当提示 Starting ChromeDriver xxx on port 9515
信息时,说明 ChromeDriver
设置成功。
Selenium调用Firefox浏览器
安装 Firefox 浏览器
可以通过 apk
直接安装 Firefox 浏览器:
1 | $ apk add firefox-esr |
然后还要安装 firefox 的依赖包:
1 | $ apk add dbus-x11 ttf-freefont |
其中 dbus-x11
中 x11
中是数字1,D-Bus
是一个消息总线,用于在应用程序间发送消息。 如果不安装会报如下错误信息:
selenium.common.exceptions.WebDriverException: Message: connection refused
在 geckodriver.log 文件中查看到如下信息:
process 116: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open “/etc/machine-id”: No such file or directory
See the manual page for dbus-uuidgen to correct this issue.
D-Bus not compiled with backtrace support so unable to print a backtrace
Redirecting call to abort() to mozalloc_abort
其中 ttf-freefont
是一个字体相关的依赖包,如果不安装会报如下错:
selenium.common.exceptions.WebDriverException: Message: Failed to decode response from marionette
在 geckodriver.log 文件中查看到如下信息:
Crash Annotation GraphicsCriticalError: |[0][GFX1]: no fonts - init: 1 fonts: 0 loader: 0[GFX1]: no fonts - init: 1 fonts: 0 loader: 0
^G[162] ###!!! ABORT: unable to find a usable font (serif): file /home/buildozer/aports/community/firefox-esr/src/firefox-45.4.0esr/gfx/thebes/gfxTextRun.cpp
[162] ###!!! ABORT: unable to find a usable font (serif): file /home/buildozer/aports/community/firefox-esr/src/firefox-45.4.0esr/gfx/thebes/gfxTextRun.cpp,
可通过命令 firefox
测试 firefox浏览器是否安装成功:
1 | $ firefox |
同样的,由于没有显示窗口,也会提示 no display
的错误。
安装 geckodriver
下载 geckodriver
访问站点 geckodriver 下载当前系统对应 geckodriver 程序。
执行如下命令:
1 | $ curl https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-linux64.tar.gz -O |
解压后我们得到了一个 geckodriver
执行程序。
该 geckodriver
压缩包可能由于网络原因下载失败,可通过迅雷等软件下载后拷贝到Linux系统中。
将 geckodriver 放到系统 PATH 目录下
我们可以在程序中指定具体的 geckodriver 所在的目录,不指定的话会默认去系统PATH目录下找。为了编程方便,我们将其放到系统PATH目录下。
查看系统目录:
1 | $ echo $PATH |
这里我将其放到 /usr/local/bin/
目录下,并添加可执行权限:
1 | $ mv ./geckodriver /usr/local/bin/ |
测试 geckodriver
执行 geckodriver
查看是否能正常运行。
1 | $ geckodriver |
当提示 Listening on 127.0.0.1:4444
信息时,说明 geckodriver
设置成功。
如果提示如下错误信息,则是在系统PATH下找不到 geckodriver
:
selenium.common.exceptions.WebDriverException: Message: ‘geckodriver’ executable needs to be in PATH.
安装虚拟显示器 xvfb
为什么要用 xvfb??
xvfb 这个工具相当于一个wrapper,给应用程序提供虚拟的 X server
执行如下命令安装
1 | $ apk add xvfb |
测试 selenium 调用浏览器获取网页
Chrome 版本
1 | #coding:utf-8 |
将以上代码保存为 chrome.py
,执行:
1 | $ python chrome.py |
Firefox 版本
1 | #coding:utf-8 |
将以上代码保存为 firefox.py
,执行:
1 | $ python firefox.py |
Docker实现
详情请参考开源项目:
- Leafney/alpine-selenium-chrome
- leafney/alpine-selenium-chrome
- Leafney/alpine-selenium-firefox
- leafney/alpine-selenium-firefox