自动打卡脚本

一、需求分析

大二在校期间,因为经常忘记健康打卡功能,被辅导员批评,想着自己是计算机专业的,尝试用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()

四、开机自动运行

出现的问题:

  1. 用了几天脚本发现还是会忘记打卡。
  2. 我要是记得运行脚本就不会忘记打卡了,能不能用一种方式让他自己使用脚本

解决方案:

  1. 找到 控制面板 中的管理工具,选择任务计划程序
  2. 创建基本任务,选择定时调用脚本的时间。
  3. 创建触发器(开机延迟25秒后执行)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值