标题: Docker+selenium实现自动化健康报备攻略
1. 背景介绍
健康报备现在已经成为了很多单位和个人的重要任务,而每天手动进行报备,不仅麻烦,而且还容易出现漏报等问题。于是,许多人开始尝试使用自动化工具来实现健康报备的自动提交。其中,Docker+selenium成为了一种比较常用的组合。
2. Docker+selenium的基本原理
Docker+selenium可以理解为在Docker镜像内安装并运行selenium自动化测试工具。通过使用Docker可以方便地创建和管理镜像,而使用selenium则可以实现浏览器自动化操作。这样,我们就可以创建一个Docker镜像,并在其中安装好selenium实现自动化健康报备的任务。
3. 实现步骤
3.1 准备工作
在开始使用Docker+selenium实现自动化健康报备之前,我们需要先完成以下几个准备工作:
- 安装Docker和docker-compose
- 准备Python环境并安装selenium和requests库
3.2 创建Docker镜像
创建Docker镜像的具体步骤如下:
- 创建一个新的文件夹,用于存放Dockerfile和docker-compose.yml文件;
- 在该文件夹下创建一个名为Dockerfile的文件,并将以下内容复制到文件中:
FROM python:3
RUN apt-get update && apt-get install -yqq firefox-esr xvfb
RUN wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
RUN apt-get update && apt-get install -yqq google-chrome-stable
COPY . /app
WORKDIR /app
COPY requirements.txt /app
RUN pip install --no-cache-dir -r /app/requirements.txt
CMD [ "python", "./main.py" ]
解释:
- 第1行指定基础镜像为python3
- 第2行安装firefox和xvfb,xvfb是模拟X环境,让firefox可以运行在无头模式下
- 第3-5行安装chrome
- 第7行将本地目录/app拷贝到镜像的/app目录下,WORKDIR指定工作目录
- 第8行将本地的requirements.txt拷贝到镜像的/app目录下
- 第9行使用pip安装所需的Python依赖
-
第11行指定容器启动方式为python main.py,main.py是我们后面要实现的脚本。
-
在该文件夹下创建一个名为docker-compose.yml的文件,并将以下内容复制到文件中:
version: '2'
services:
web:
build: .
volumes:
- .:/app
environment:
DISPLAY: :99
depends_on:
- xvfb
- firefox
xvfb:
image: registry.cn-beijing.aliyuncs.com/vincent/docker-xvfb
privileged: true
restart: always
tty: true
container_name: xvfb
firefox:
image: starefossen/firefox
volumes:
- /dev/shm:/dev/shm
depends_on:
- xvfb
environment:
DISPLAY: :99
解释:
- 第3-14行定义web服务:
- build: . 指定镜像的构建路径为当前路径
- volumes: .:/app 将本地目录/app映射到容器的/app目录下
- environment: DISPLAY: :99 设置环境变量,表示使用Xvfb显示
- depends_on: 启动容器时依赖xvfb和firefox两个容器
- 第16-24行定义xvfb服务,使用的是一个国内的Docker镜像
- 第26-36行定义firefox服务,使用的是官方的Docker镜像
运行以下命令创建Docker镜像:
docker-compose build
3.3 实现自动化健康报备
接下来,我们需要创建一个Python脚本,在selenium中实现自动化健康报备。
创建一个名为"main.py"的Python脚本,并将以下内容复制到文件中:
import time
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import requests
# 报备地址
url = 'https://xx.xx.com'
# 你的学/工号
username = 'xxx'
# 密码
password = 'xxx'
def check_health():
# 启动firefox浏览器
options = webdriver.FirefoxOptions()
#options.headless = True
driver = webdriver.Firefox(options=options)
driver.implicitly_wait(10)
# 使用浏览器访问指定的网址
driver.get(url)
# try:
# 输入用户名和密码,点击登录
username_element = driver.find_element_by_id('user_name')
password_element = driver.find_element_by_id('password')
username_element.send_keys(username)
password_element.send_keys(password)
time.sleep(0.5)
action = ActionChains(driver).move_to_element(password_element).click()
action.perform()
time.sleep(0.5)
# 定位到“填报”按钮并点击
fill_in_element = driver.find_element_by_xpath('//*[@id="app"]/div[4]/div[1]/div/div[1]/div[1]/div[3]/button')
fill_in_element.click()
time.sleep(1)
# 定位到“膳食认证”按钮并点击
checkbox_elements = driver.find_elements_by_xpath('//*[@id="app"]/div[4]/div[1]/div/div[2]/div/div/div[2]/div/div')
checkbox_elements[-1].click()
time.sleep(1)
# 定位到“上报按钮”并点击
submit_element = driver.find_element_by_xpath('//*[@id="app"]/div[4]/div[1]/div/div[10]/div[3]/button[2]')
submit_element.click()
time.sleep(1)
# 模拟键盘操作进行确认
actions = ActionChains(driver)
actions.send_keys(Keys.TAB * 8, Keys.SPACE)
actions.perform()
time.sleep(1)
# 定位到“确认上报”按钮并点击
confirm_element = driver.find_element_by_xpath('//*[@id="app"]/div[5]/div/button[2]')
confirm_element.click()
time.sleep(1)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
check_health()
在使用过程中,需要将url、username和password设置为你自己的健康报备地址、用户名和密码。
3.4 启动Docker容器
接下来我们需要启动Docker容器来自动执行健康报备任务。
在当前目录下,运行以下命令启动容器。
docker-compose up
3.5 任务调度
为了每天自动执行健康报备任务,我们还需要使用定时任务调度库来实现自动执行脚本的功能。以Linux系统为例,可以使用crontab来实现这个功能。
运行以下命令打开cron编辑界面:
crontab -e
在打开的文件末尾加入以下内容,表示每天的8:00和20:00分别执行健康报备任务:
0 8 * * * docker-compose -f /path/to/docker-compose.yml up -d
0 20 * * * docker-compose -f /path/to/docker-compose.yml up -d
注意,需要将/path/to/docker-compose.yml替换成你自己的docker-compose.yml的路径。
4. 示例说明
示例1:使用firefox执行健康报备
在3.3中的代码中,我们使用了Firefox作为浏览器来执行健康报备。Firefox是一款免费的开源浏览器,在大多数的情况下可以满足我们的需求。但是,如果你的健康报备网站需要使用Chrome浏览器才能正常工作,那么可以将3.3中的代码中的Firefox相关代码修改为Chrome相关代码即可。
示例2:将Docker部署到Kubernetes中
Docker镜像可以很方便地部署到Kubernetes集群中。在Kubernetes中,可以使用Deployment或者StatefulSet对象来部署和管理Docker容器。可以使用以下命令将Docker镜像部署到Kubernetes中:
kubectl create deployment selenium --image=<docker-image> --replicas=1
其中,\<docker-image>是你自己的Docker镜像地址。使用以上命令创建的Deployment对象将会在Kubernetes中自动创建和管理1个Docker容器。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Docker+selenium实现自动化健康报备的方法 - Python技术站