Python + Selenium 实现自动打卡

前言

因为每天都要填写健康调查,数据历史不能保留,比较繁琐,而且忘记了会扣钱,所以写了个程序定制执行。

Selenium 简介

Selenium 是一个用于Web应用程序测试的工具。

Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),[Mozilla Firefox](https://baike.baidu.com/item/Mozilla Firefox/3504923),Safari,Google Chrome,Opera等。主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

操作过程

日期控件处理

image.png

<input type="text" style="padding-left:25px;" id="q1" 
name="q1" readonly="readonly" data-role="datebox" class="datebox">

如图,日期控件点击操作比较麻烦,所以我们通过执行 Javascript 脚本,去除日期控件只读属性。

# 日期控件:移除只读属性,直接填值
rm_read_only = "document.getElementById('q1').removeAttribute('readonly')"
# 执行 js 脚本
browser.execute_script(rm_read_only)

获取当天日期并格式化,直接赋值到对应input标签上。

# 获取今天日期,并格式化日期:2020-10-01
today = time.strftime("%Y-%m-%d", time.localtime(time.time()))
browser.find_element_by_id("q1").send_keys(today)

输入框处理

image.png

<input rowid="1" type="text" id="q3_0" name="q3_0" minword="2" maxword="5">

输入框的处理比较简单,我们直接通过对应的 id 获取元素,并赋值即可。

browser.find_element_by_id("q3_0").send_keys("yujian95.cn")

单选框点击

image.png

<div class="label" for="q7_1">正常</div>

单选框因为没有对应的 idname ,这里我们通过 xpath 查找对应的元素,并选择即可。

# 单选框点击
browser.find_element_by_xpath("//*[@for='q7_1']").click()

完整代码

代码执行直接增加了 time.sleep(s) 是为了模拟正式用户操作的耗时。

from selenium import webdriver
import time

browser = webdriver.Chrome()
# 网页链接
browser.get('https://www.wjx.top/m/995.aspx')
time.sleep(1)

# 日期控件:移除只读属性,直接填值
rm_read_only = "document.getElementById('q1').removeAttribute('readonly')"
# 执行 js 脚本
browser.execute_script(rm_read_only)
time.sleep(1)

# 获取今天日期,并格式化日期:2020-10-01
today = time.strftime("%Y-%m-%d", time.localtime(time.time()))
browser.find_element_by_id("q1").send_keys(today)
time.sleep(3)

# 输入框填值,为了模拟真实填写,这里设置了一下执行间隔
browser.find_element_by_id("q3_0").send_keys("china")
time.sleep(3)
browser.find_element_by_id("q3_1").send_keys("yujian95")
time.sleep(3)

# 单选框点击
browser.find_element_by_xpath("//*[@for='q7_1']").click()

# 点击提交按钮
browser.find_element_by_id("ctlNext").click()
time.sleep(3)

# 退出浏览器
browser.quit()