Docker环境下运行python+selenium+chrome
Docker环境下运行python+selenium+chrome
docker运行时占用的资源非常少,而且能将环境进行有效的隔离,可以快速的进行部署,因此可以将docker与selenium结合实现在容器中执行无界面的自动化操作。例如:自动测试、自动下载邮件等。
需求说明
通过Selenium自动的登录邮箱,下载邮箱中符合条件的邮件,并对邮件的内容进行解析存档。
方案选择
Selenium官方提供了基于selenium hub的方式来管理selenium的node节点,提供了分布式的远程调度方案,可以为SeleniumGrid添加各种类型的WebDriver。

基于Selenium Grid的方案适用于以下场景:
1.通过Selenium自动访问网页时,需要阻塞等待与用户的交互,例如需要输入短信验证码的场景,通过Selenium Grid的调度,可以最优的利用所有可访问的资源,提高系统的并发执行效率。
2.需要对网页的兼容性进行测试时,可以接入多种内核的WebDriver到Selenium Grid中,这样在进行网页的自动化测试时,也同时对浏览器的兼容性进行了测试。
3.访问只支持IE内核的网站时,例如一些开发比较早的政府网站等。
4.访问需要安装安全控件的网站,例如网银的登录等。
本次的需求对时效性要求不高,邮件的获取需要由定时器进行触发,如果使用Selenium Grid,可能会增加了整个系统的复杂程度,分布式系统中每引入一个中间件,就会增加系统的复杂性,系统的可用性就会随之降低。
基于以上分析,考虑采用selenium handless的模式,在Docker中运行Chrome的WebDriver,完成最终邮件的自动获取。
在确定方案之后,需要寻找合适的docker镜像,最终找到了chromium-xvfb这个镜像文件,集成了chromium和xvfb,可以满足在Docker容器中通过selenium来进行无界面的操作。
方案验证
1.下载chromium-xvfb的镜像文件
[root@prod ~]# docker pull markadams/chromium-xvfb-py2
2.交互模式运行
[root@prod ~]# docker run --rm -it markadams/chromium-xvfb-py2 bash
3.进入pytho环境
root@8016c66877aa:/usr/src/app# python
4.输入以下python代码
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://github.com/mark-adams/docker-chromium-xvfb/blob/master/samples/python3/test_google.py'
driver.get(url)
没有错误输出,证明Chrome已经在Docker下可以正常工作。
方案实施
以markadams/chromium-xvfb-py2作为基础镜像,重新编写的Dockerfile如下:
FROM markadams/chromium-xvfb-py2
WORKDIR /opt/zs5s/download-mail
COPY ./download-mail/.pip /root/.pip/
COPY ./download-mail/requirements.txt /opt/zs5s/download-mail/requirements.txt
RUN pip install --upgrade pip
RUN pip install -r requirements.txt && mkdir /tmp/downloaded_files
ENV DISPLAY :1
COPY ./download-mail /opt/zs5s/download-mail
COPY ./data_service /opt/zs5s/data_service
COPY ./save_mail /opt/zs5s/save_mail
COPY ./common/ /opt/zs5s/common
USER root
在编译运行后,发现在这个docker容器内单纯的去访问网页没有问题,如果去执行带有键盘的操作时,会报错,错误信息如下:
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: an X display is required for keycode conversions, consider using Xvfb
(Session info: chrome=57.0.2987.98)
(Driver info: chromedriver=2.28.455506 (18f6627e265f442aeec9b6661a49fe819aeeea1f),platform=Linux 4.4.27-moby x86_64)
经过调查是需要在启动容器时执行Xvfb,申请一块Screen,具体可以参考链接1。在Dockerfile中加入启动脚本:
CMD sh start.sh
start.sh的内容如下:
#!/bin/sh
export DISPLAY=:1
Xvfb $DISPLAY -ac -screen 0 1280x1024x8 &
sleep 1
ps -aux
tail -f start.sh #测试用,为了阻塞住容器内的进程
结果验证
在新生成的容器内执行以下的python脚本,可以正常执行,说明在Chrome中已经可以接收通过selenium传入的键盘事件。
from splinter import Browser
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'https://github.com/mark-adams/docker-chromium-xvfb/blob/master/samples/python3/test_google.py'
browser = Browser('chrome')
browser.visit(url)
element = browser.find_by_xpath('/html/body/div[1]/header/div/div/div/div/form/label/input[1]')
element.type('aaaa')
残留问题
在python退出selenium时,虽然执行了driver.quit()函数,但是实际上Chrome并没有真正的退出,似乎是selenium的一个Bug,在3.1中提到了修正,但是好像没有起作用,
selenium-commit-url
解决办法可以考虑执行shell脚本主动的kill掉Chrome的进程。
参考链接
1.protractor-sendkeys-not-working-an-x-display-is-required-for-keycode-conversion
2.crawling-python-selenium-docker
3.docker-chromium-xvfb
Docker环境下运行python+selenium+chrome的更多相关文章
- Sublime Text3配置在可交互环境下运行python快捷键
安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...
- linux环境下安装使用selenium Chrome
安装驱动 http://chromedriver.storage.googleapis.com/index.html 下载对应chrome浏览器版本的驱动程序 chmod +x chromedrive ...
- Linux环境下搭建python+selenium+webdriver环境
1.下载并安装python,一般安装linux系统,自带有python,则python不用安装.要下载可以在官网上下载: 或者使用下面命令安装: sudo apt-get install python ...
- Python selenium chrome 环境配置
Python selenium chrome 环境配置 一.参考文章: 1. 记录一下python easy_install和pip安装地址和方法 http://heipark.iteye.com/b ...
- python+selenium+Chrome options参数
python+selenium+Chrome options参数 Chrome Options常用的行为一般有以下几种: 禁止图片和视频的加载:提升网页加载速度. 添加代理:用于翻墙访问某些页面,或者 ...
- Python + Selenium +Chrome 批量下载网页代码修改【新手必学】
Python + Selenium +Chrome 批量下载网页代码修改主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt来达到在登陆状态下 批量打开并下载网页, ...
- 4.1. 如何在Windows环境下开发Python
4.1. 如何在Windows环境下开发Python 4.1. 如何在Windows环境下开发Python 4.1.1. Python的最原始的开发方式是什么样的 4.1.1.1. 找个文本编辑器,新 ...
- Elasticsearch Docker环境下安装
Elasticsearch Docker环境下安装 Daemon镜像配置的是https://registry.docker-cn.com Linux:vi /etc/docker/daemon.jso ...
- 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE
http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...
随机推荐
- C/C++ 导入表与IAT内存修正
本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入表结构的基础知识点,并通过前面编写的一些小案例,实现对内存的转储与导入表的脱壳修 ...
- 我为Dexposed续一秒——论ART上运行时 Method AOP实现
转载于:http://weishu.me/2017/11/23/dexposed-on-art/ 两年前阿里开源了 Dexposed 项目,它能够在Dalvik上无侵入地实现运行时方法拦截,正如其介绍 ...
- POJ1087DFS+匈牙利或者DINIC
题意: 有n个插孔,m个电器,q种转换器(转换器可以无限用),然后问你最多有多少个电器能充电. 思路: 比较简单,就是在建图的时候要考虑下,我用了两种方法做的,一个是最大流,这个 ...
- CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞
0x01 "Epic Turla" 网络间谍行动 在 2014 年 8 月,被誉为 "世界十大最危险的网络攻击行动" 之一的 "Epic Turla& ...
- 使用constexpr时遇到的小坑
最近在使用constexpr的时候无意中踩了个小坑. 下面给个小示例: #include <iostream> constexpr int n = 10; constexpr char * ...
- web自动化框架—BasePage 类的简单封装
优秀的框架都有属于自己的思想,在搭建web自动化测试框架时,我们通常都遵循 PO(Page Object)思想. 简单理解就是我们会把每个页面看成一个对象,一切皆对象,面向对象编码,这样会让我们更好的 ...
- utf8改成utf8mb4实战教程
前言: 在 MySQL 中,系统支持诸多字符集,不同字符集之间也略有区别.目前最常用的字符集应该是 utf8 和 utf8mb4 了,相比于 utf8 ,utf8mb4 支持存储 emoji 表情,使 ...
- c语言编程学习之字符串
字符串字面量与字符变量 1.字符串字面量 字符串字面量是一对双引号括起来的字符序列.当c语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间.这块内存空间用来存 ...
- 偷梁换柱:使用mock.patch辅助python单元测试
最近在搞软工项目的后端测试,重新复习了一下python的mock.patch,并用它简化了对一些复杂逻辑的测试,在此记录 问题描述 本组的项目比较特殊,设计对教务网站的模拟登陆与信息爬取,同时不少接口 ...
- [bug] Job for network.service failed because the control process exited with error code
原因 复制虚拟机,没有改网卡配置文件 参考 https://blog.csdn.net/dongfei2033/article/details/81124465