Docker环境下运行python+selenium+chrome

docker运行时占用的资源非常少,而且能将环境进行有效的隔离,可以快速的进行部署,因此可以将docker与selenium结合实现在容器中执行无界面的自动化操作。例如:自动测试、自动下载邮件等。

需求说明

通过Selenium自动的登录邮箱,下载邮箱中符合条件的邮件,并对邮件的内容进行解析存档。

方案选择

Selenium官方提供了基于selenium hub的方式来管理selenium的node节点,提供了分布式的远程调度方案,可以为SeleniumGrid添加各种类型的WebDriver。

Selenium Grid架构图

基于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的更多相关文章

  1. Sublime Text3配置在可交互环境下运行python快捷键

    安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...

  2. linux环境下安装使用selenium Chrome

    安装驱动 http://chromedriver.storage.googleapis.com/index.html 下载对应chrome浏览器版本的驱动程序 chmod +x chromedrive ...

  3. Linux环境下搭建python+selenium+webdriver环境

    1.下载并安装python,一般安装linux系统,自带有python,则python不用安装.要下载可以在官网上下载: 或者使用下面命令安装: sudo apt-get install python ...

  4. Python selenium chrome 环境配置

    Python selenium chrome 环境配置 一.参考文章: 1. 记录一下python easy_install和pip安装地址和方法 http://heipark.iteye.com/b ...

  5. python+selenium+Chrome options参数

    python+selenium+Chrome options参数 Chrome Options常用的行为一般有以下几种: 禁止图片和视频的加载:提升网页加载速度. 添加代理:用于翻墙访问某些页面,或者 ...

  6. Python + Selenium +Chrome 批量下载网页代码修改【新手必学】

    Python + Selenium +Chrome 批量下载网页代码修改主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt来达到在登陆状态下 批量打开并下载网页, ...

  7. 4.1. 如何在Windows环境下开发Python

    4.1. 如何在Windows环境下开发Python 4.1. 如何在Windows环境下开发Python 4.1.1. Python的最原始的开发方式是什么样的 4.1.1.1. 找个文本编辑器,新 ...

  8. Elasticsearch Docker环境下安装

    Elasticsearch Docker环境下安装 Daemon镜像配置的是https://registry.docker-cn.com Linux:vi /etc/docker/daemon.jso ...

  9. 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE

    http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...

随机推荐

  1. Leecode第二题:两数相加

    Leecode2 先看题目 : 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的 ...

  2. 1087 All Roads Lead to Rome

    Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...

  3. ListBox控件简单的数据绑定

    <ListBox Margin="17,8,15,26" Name="ListBoxName" ItemsSource="{Binding Ta ...

  4. 【Nginx(二)】Nginx目录结构和常用的命令以及核心配置文件

    Nginx的目录结构: 默认的安装路径 : /usr/local/nginx 安装完成后,Nginx的目录结构如下: conf:   #所有配置文件的目录 nginx.conf  #默认的主要配置文件 ...

  5. hdu2899 三分

    题意:      给你个函数,F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x ,给你一个y,x的范围是0--100 问你最小的 F(x) 思路:       本人推数学公式啥 ...

  6. 如何使用mongo shell

    Cd到MongoDb安装目录到bin目录下,执行mongo命令即可,其他命令参考手册:https://www.runoob.com/mongodb/mongodb-create-collection. ...

  7. windows 7系统封装总结

    win7系统封装总结 需求:对于个人家庭用户,网上下载原版镜像或者下载好别人封装好的系统都无所谓,但是在公司办公的特殊环境下, 有时需要经常装一些特殊的软件,根据实际情况,封装一个适合本公司使用环境的 ...

  8. 痞子衡嵌入式:可通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信. i.MXRT系列高性能微控制器从2 ...

  9. Instagram 为什么不用redis

    Hi 我还是大粽子 碎碎念 让我比较兴奋的就是这段时间的文章,被感兴趣的同学一一关注,关注量上涨就是我的最大动力. 我每周都会输出至少3篇原创文章,希望能被更多的同学关注,点赞,在看,形成习惯. In ...

  10. 【我给面试官画饼】Python自动化测试面试题精讲

    那今天给家分享的是一个面试主题. 就比如说我们的自动化测试,自动化如何去应对面试官,和面试官去聊一聊自动化的心得,自动化你现在去面试的时候是一个非常重要的一个关键点,所以如果你在这方面有一定的心得.那 ...