一、需求分析
大二在校期间,因为经常忘记健康打卡功能,被辅导员批评,想着自己是计算机专业的,尝试用Python + Selenium
实现自动健康打卡功能。
环境要求:
- python-3.6.6
- Chrome 浏览器
二、代码分析
包引入
from selenium import webdriver
import random
from time import sleep
进入登录界面
# 选择Chrome浏览器
driver = webdriver.Chrome()
# 这是我学校的打卡网页,需自行修改
driver.get("***")
# 这两步把操作界面切换到新打开的浏览器页面
now_handle = driver.current_window_handle
driver.switch_to.window(now_handle)
# 清除输入框内容、输入账号密码,需自行修改
driver.find_element_by_id("username").clear()
driver.find_element_by_id("password").clear()
driver.find_element_by_id("username").send_keys("*********") # 账号
driver.find_element_by_id("password").send_keys("***********") # 密码
# 延时2秒
sleep(2)
跳转界面
这里我遇到过一个问题,学校的网页加载较慢,而网页加载不完python脚本会卡住不往下执行。为了快速完成打卡,采用下面的解决方法:
# 如果过了5秒,页面还没加载完,发出error警告
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
# error的自动处理
try:
# 如果出现error,就试试看点击 id为passbutton 的页面元素,登录网站
# 因为调试bug时候发现我的代码会卡在这一句
driver.find_element_by_id("passbutton").click()
except:
# 尝试点击失败(卡住),停止加载页面
driver.execute_script("window.stop()")
这样便可以不需要等待页面完全加载成功,就继续执行下面的操作。
健康信息填报
# 当前打开的所有窗口
windows = driver.window_handles
# 将操作转换到最新打开的窗口
driver.switch_to.window(windows[-1])
# 通过绝对路径方式找到并点击健康信息填报图标
driver.find_element_by_xpath("/html/body/div/div[2]/div[1]/div/div/div/div/div/div/ul/li[2]/div/div").click()
# 延时加载
sleep(2)
# 当前打开的所有窗口
windows = driver.window_handles
# 转换到最新打开的窗口
driver.switch_to.window(windows[-1])
每次打开一个新的页面都需要转换操作窗口
:
# 当前打开的所有窗口
windows = driver.window_handles
# 将操作转换到最新打开的窗口
driver.switch_to.window(windows[-1])
表单提交
通过定位弹窗的路径确认元素的位置并提交表单。
try:
print("search")
# 试试有没有弹窗
driver.find_element_by_xpath('//*[@id="layui-layer100002"]')
# 点击 “是” 按钮
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a[1]").click()
print("fill")
# 找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_zwtw").send_keys('%.1f' % random.uniform(36.0, 36.6))
# 找到并点击提交按钮
driver.find_element_by_id("post").click()
print("done")
# 小延时
sleep(2)
# 点击确定
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a").click()
except:
print("fill")
# 没有弹窗的话,直接找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_zwtw").send_keys('%.1f' % random.uniform(36.0, 36.6))
# 找到并点击提交按钮
driver.find_element_by_id("post").click()
print("done")
# 小延时
sleep(2)
# 点击确定
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a").click()
三、源代码
from selenium import webdriver
import random
from time import sleep
# 选择Chrome浏览器
driver = webdriver.Chrome()
# 这是我学校的打卡网页,需自行修改
driver.get("http://my.just.edu.cn/_s2/students_sy/main.psp")
# 这两步把操作界面切换到新打开的浏览器页面
now_handle = driver.current_window_handle
driver.switch_to.window(now_handle)
# 清除输入框内容、输入账号密码,需自行修改
driver.find_element_by_id("username").clear()
driver.find_element_by_id("password").clear()
driver.find_element_by_id("username").send_keys("***********") # 账号
driver.find_element_by_id("password").send_keys("**********") # 密码
# 延时2秒
# 如果过了5秒,页面还没加载完,发出error警告
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
# error的自动处理
try:
# 如果出现error,就试试看点击 id为passbutton 的页面元素,登录网站
# 因为调试bug时候发现我的代码会卡在这一句
driver.find_element_by_id("passbutton").click()
except:
# 尝试点击失败(卡住),停止加载页面
driver.execute_script("window.stop()")
# 当前打开的所有窗口
windows = driver.window_handles
# 将操作转换到最新打开的窗口
driver.switch_to.window(windows[-1])
# 通过绝对路径方式找到并点击健康信息填报图标
driver.find_element_by_xpath("/html/body/div/div[2]/div[1]/div/div/div/div/div/div/ul/li[2]/div/div").click()
# 延时加载
sleep(2)
# 当前打开的所有窗口
windows = driver.window_handles
# 转换到最新打开的窗口
driver.switch_to.window(windows[-1])
try:
print("search")
# 试试有没有弹窗
driver.find_element_by_xpath('//*[@id="layui-layer100002"]')
# 点击 “是” 按钮
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a[1]").click()
print("fill")
# 找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_zwtw").send_keys('%.1f' % random.uniform(36.0, 36.6))
# 找到并点击提交按钮
driver.find_element_by_id("post").click()
print("done")
# 小延时
sleep(2)
# 点击确定
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a").click()
except:
print("fill")
# 没有弹窗的话,直接找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_zwtw").send_keys('%.1f' % random.uniform(36.0, 36.6))
# 找到并点击提交按钮
driver.find_element_by_id("post").click()
print("done")
# 小延时
sleep(2)
# 点击确定
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a").click()
四、开机自动运行
出现的问题:
- 用了几天脚本发现还是会忘记打卡。
- 我要是记得运行脚本就不会忘记打卡了,能不能用一种方式让他自己使用脚本
解决方案:
- 找到
控制面板
中的管理工具,选择任务计划程序
。 - 创建基本任务,选择定时调用脚本的时间。
- 创建触发器(开机延迟25秒后执行)。