
学校的自动打卡
然后再查找登录按钮的所在处,也是可以用id定位
所以可以先定位,然后用
可以选择把代码放在服务器上,创建一个定时任务,每天定时打卡,这样连运行程序都省去了。
发布日期:2021-05-07 10:48:28
浏览次数:12
分类:技术文章
本文共 4828 字,大约阅读时间需要 16 分钟。
学校每天都要让我们去打卡,虽然时间很短,但还是要手动操作,我自己写了个程序,来代替手动打卡。
信息门户登录
首先,要在进行登录。进行信息搜集,先找到登录框的用户名和密码的所在处,发现可以用id来进行定位


send_keys()
函数将账号和密码输入进去,click()
函数实现点击。如果账号或密码输入错误,会显示认证信息无效
,可以用一个if
循环实现 username_btn = bro.find_element_by_id('username')password_btn = bro.find_element_by_id('password')username_btn.send_keys('xxxxxxxxx')password_btn.send_keys('xxxxxx')login_btn = bro.find_element_by_id('passbutton')login_btn.click()if '认证信息无效' in bro.page_source: print('登录失败,账号密码可能错误')else: print('登录成功')
这个网站登陆后会有一个bug,显示访问页面出错,应对的操作是需要返回一下
if '重新登录' in bro.page_source: bro.back()
进入打卡页面
接下来是点击打卡,进入打卡页面,可以看到,点健康信息打卡下面的星星也是能进去的,所以在标签定位时可以选择星星,然后利用class
标签进去


clock_in_btn = bro.find_element_by_class_name('stars')clock_in_btn.click()print('已进入打卡页面')
因为打卡界面是一个新的句柄,并不是在当前句柄页,所以要进行句柄的切换。先获取当前浏览器的所有句柄,然后选择打卡页面的句柄。
sleep(3)n = bro.window_handles # 获取当前浏览器所有窗口句柄# print('当前句柄:', n)bro.switch_to.window(n[-1]) # 切换到打卡窗口的句柄
取消弹窗
进去后,如果当日打过卡,会有一个弹窗,问你当日已打过卡,是否需要继续打卡。这里可以选择点击x
将窗口关闭。定位的话可以选用xpath

# 如果当日提交过,选择关闭按钮if '当日已经' in bro.page_source: close_btn = bro.find_element_by_class_name('layui-layer-btn0') close_btn.click()
数据填写及提交
在这个打卡中,绝大部分的信息是已经填写好的,只差一个昨晚体温和今晨体温,我们可以全部填36.7,在开发者工具中查看,发现可以用id定位


# 体温数值填入tw = bro.find_element_by_id('input_tw')tw.send_keys('36.7')zwtw = bro.find_element_by_id('input_zwtw')zwtw.send_keys('36.7')print('温度已填写')
最后就是点击提交按钮了,这里我一开始是用的class标签定位,发现一直不成功,后面改用xpath就成功了,也不知道啥原因。

# 提交submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')submit_btn.click()print('打卡成功')
完整代码
from selenium import webdriverfrom time import sleepfrom lxml import etreeif __name__ == '__main__': bro = webdriver.Chrome('./chromedriver.exe') bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F') print('信息门户加载完成') username_btn = bro.find_element_by_id('username') password_btn = bro.find_element_by_id('password') username_btn.send_keys('xxxxxxxx') password_btn.send_keys('xxxxx') login_btn = bro.find_element_by_id('passbutton') login_btn.click() if '认证信息无效' in bro.page_source: print('登录失败,账号密码可能错误') else: print('登录成功') # 信息门户的bug,要返回上一页 bro.back() # 开始点击打卡 daka_btn = bro.find_element_by_class_name('stars') daka_btn.click() print('已进入打卡页面') # 将旧url更新到打卡的url sleep(3) n = bro.window_handles # 获取当前浏览器所有窗口句柄 # print('当前句柄:', n) bro.switch_to.window(n[-1]) # 切换到打卡窗口的句柄 # 如果当日提交过,选择关闭按钮 if '当日已经' in bro.page_source: close_btn = bro.find_element_by_class_name('layui-layer-btn0') close_btn.click() # 体温数值填入 tw = bro.find_element_by_id('input_tw') tw.send_keys('36.7') zwtw = bro.find_element_by_id('input_zwtw') zwtw.send_keys('36.7') print('温度已填写') # 提交 submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]') submit_btn.click() print('打卡成功') sleep(3) bro.quit()
函数实现打卡
使用这个代码可能会帮很多人打卡,可以选择将上面的打卡代码封装为一个函数,这样就可以实现多人打卡,并且,在打卡的时候看不看弹出的浏览器内容也不是那么的重要,可以选择将浏览器弹窗隐藏。
from selenium import webdriverfrom time import sleepfrom lxml import etreefrom selenium.webdriver.chrome.options import Optionsdef clock_in(uname, passwd): # 实现无可视化操作 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='./chromedriver.exe', options=chrome_options) bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F') print('信息门户加载完成') username_btn = bro.find_element_by_id('username') password_btn = bro.find_element_by_id('password') username_btn.send_keys(uname) password_btn.send_keys(passwd) login_btn = bro.find_element_by_id('passbutton') login_btn.click() if '认证信息无效' in bro.page_source: print('登录失败,账号或密码可能错误') else: print('登录成功') # 信息门户的bug,要返回上一页 if '重新登录' in bro.page_source: bro.back() # 开始点击打卡 clock_in_btn = bro.find_element_by_class_name('stars') clock_in_btn.click() print('已进入打卡页面') # 将旧url更新到打卡的url sleep(3) n = bro.window_handles # 获取当前浏览器所有窗口句柄 # print('当前句柄:', n) bro.switch_to.window(n[-1]) # 切换到打卡窗口的句柄 # 如果当日提交过,选择关闭按钮 if '当天已经' in bro.page_source: close_btn = bro.find_element_by_class_name('layui-layer-btn0') close_btn.click() # 体温数值填入 tw = bro.find_element_by_id('input_tw') tw.send_keys('36.7') zwtw = bro.find_element_by_id('input_zwtw') zwtw.send_keys('36.7') print('温度已填写') # 提交 submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]') submit_btn.click() print('打卡成功')if __name__ == '__main__': username = input('请输入学号:') password = input('请输入密码:') clock_in(username, password)
最终的效果图

发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月07日 02时58分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JS中如何创建对象
2019-03-04
二叉树的基础练习题代码
2019-03-04
(JAVA小白必看)小白IDEA的安装与配置
2019-03-04
SpringMVC模板代码
2019-03-04
C++ Primer学习笔记——第2章 变量和基本数据类型
2019-03-04
5.11 TEST1
2019-03-04
6.14 阶段考试
2019-03-04
牛客IOI周赛19-普及组
2019-03-04
2020牛客NOIP赛前集训营-普及组(第四、五场)
2019-03-04
uni-app请求头中携带token
2019-03-04
常用的 Git 命令和小技巧(1)
2019-03-04
vue中接收后台的图片验证码并显示
2019-03-04
springboot入门(1)---整合MyBatis
2019-03-04
Vue入门学习笔记(1)
2019-03-04
前端入门经验——页面布局
2019-03-04
ECharts——双向柱状图
2019-03-04
Vue——引进bootstrap
2019-03-04
Vue——引进ivew
2019-03-04
趣谈win10常用快捷键
2019-03-04
趣谈文件扩展名和隐藏文件
2019-03-04