零基础十分钟看懂自动打卡程序超详细!!

本文使用python的selenium模块实现一个自动打卡程序


本文结构:首先介绍三个预备知识,大佬可以跳过啦。然后直接上手代码(因为这个代码真的超级超级简单)。不过 不建议没接触过这个模块的旁友直接看代码。毕竟不同的网页处理方法还是不一样的。

本文尽可能详细地介绍原理,致力于让读者看完能够写出各种不同打卡网页的程序。

selenium模块简介

这个模块允许我们使用py程序来操作Chrome、Firefox等主流浏览器,实现自动化测试。

我们要让电脑帮我们用浏览器做一件事情,就要告诉它先点哪里,输入什么内容,然后再点哪里。这个“点哪里”就是通过selenium模块的定位来实现的:

它提供了八种定位方法,感兴趣的朋友可以看一下。这里主要介绍程序中用到的三种:(具体使用方法在代码部分讲)

方法 作用
find_element_by_id() 通过元素的id定位
find_element_by_name() 通过元素的name定位
find_element_by_xpath() 通过元素的xpath定位

这个idnamexpath是什么呢?其实就是网页中某个内容的属性。

我们知道一个网页是由许多元素组成的,比如你正在浏览的这个博客,其中有博主我的头像、你正在看的文字、左下角的点赞按钮(疯狂明示)等等等等。程序员在写网页的时候,为了方便使用辨别这些元素,会给元素加上不同的idname,就像我们的名字一样。

nameid的区别在于,name就像我们的名字,而id像我们的身份证号。可能有重名的人,但没有同样的身份证号。(这么说并不严谨,但是姑且这么理解吧 其它的区别对于这个程序也不是很重要 )值得注意的是,并不是每一个元素都要有name或者id属性。所以我们还需要第三种方法XPath定位

比如你正在浏览的这个博客,按下F12,点击element查看源代码,有的标签是这样的:我们说的
在这里插入图片描述
比如这个div标签就只有id属性
在这里插入图片描述
可以看到上图的input标签既有id这个属性,又有name这个属性。

接下来安装selenium:

pip install Selenium

浏览器驱动

selenium本身不具有打开浏览器的能力,需要各个浏览器的驱动配合。接下来我们安装一个浏览器驱动:下载之前查清楚自己浏览器的版本!
Chrome浏览器版本对应
Chrome各种版本驱动下载
其他浏览器可以自行百度下载地址

FirefoxDriver等驱动下载及驱动配置

下载完浏览器驱动,还需要配置一下环境变量让你的程序能找得到这个驱动:(环境变量里存的路径就是告诉电脑,在需要运行某个程序的时候可能可以去哪里找。系统在收到一个程序运行命令以后,会到这个环境变量表里一个个路径查看有没有你要的程序)

我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将你的驱动存放路径如“F:\ChromeDriver”目录添加到Path的值中。比如:Path字段;F:\ChromeDriver

配置完环境变量,就可以使用下面的代码获取浏览器驱动driver了:

 driver = webdriver.Chrome()

模拟鼠标点击、填写

以下面这个网页为例,我需要填写学号、密码然后点击“登陆”按钮。那么首先,如何在使用程序来定位这几个需要填写/点击的位置?用上面介绍的方法!
在这里插入图片描述
F12找到Elements源码,然后点击下图左边的鼠标图标,再点击上图中需要输入学号的位置——寻找这个元素的源码
在这里插入图片描述
我们找到了这个:
在这里插入图片描述
可以看到这个标签有一个name属性,其值为userid。那么我们就使用它的name来定位吧!代码:

driver.find_element_by_name('userid').send_keys('你的学号')

上图driver是在本文驱动安装处获取的浏览器驱动

一行代码就搞定了学号填写!是不是很简单?!对于其它我们需要填的地方,如法炮制即可。

遇到没有name属性的标签怎么办?比如说下面这个“登陆”按钮:
在这里插入图片描述
没关系!它有id啊。让我们用id来定位:

driver.find_element_by_id('formSubmitBtn').click()#点击登录

XPath定位

有的位置没有id也没有name,只有class,怎么办,难道用class来定位?但是别的元素也有相同的class。那我们只能用xpath了(实际上,前面的定位用xpath应该都没问题,因为每个页面元素都必有一个唯一的xpath

如何找到某个输入框的xpath:右键单击输入框的代码打开菜单以后按照下图操作:在这里插入图片描述
找到一个输入框的xpath以后,我们将其存在一个变量中(因为直接使用会很长。。。当然你直接粘贴到相应位置也没啥问题)

movement = "/html/body/div[1]/form/div[3]/div[2]/label[1]"#当日没有移动的按钮
driver.find_element_by_xpath(movement).click()#点选按钮

几个细节

博主示例的这个网站在填写打卡信息以后,需要点击“提交”然后过一会儿才会弹出确认窗口,还需要确认一次提交。但是在点击“提交”按钮的同时,确认窗口还没出现。所以我们在两次点击之间使用一个sleep让程序暂停那么一会儿,等这个窗口出来了,再点击确认。

driver.find_element_by_xpath(submit).click()#点击提交
time.sleep(2)
driver.find_element_by_xpath(check).click()#点击确定

完整代码

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from pyrsistent._transformations import inc

# 只需修改下面三项即可 学号 密码 打卡网址
username = "登陆账号"
password = "对应密码"
url = "此处填写打卡网址" 

# 下面是每次填报的时候几个需要填写的地方,F12找到这些位置的 full XPath
movement = "/html/body/div[1]/form/div[3]/div[2]/label[1]"#有无移动
touch = "/html/body/div[1]/form/div[4]/div[2]/label[1]"#有无接触史
condition = "/html/body/div[1]/form/div[5]/div[2]/label[1]"#健康状况
quarantine = "/html/body/div[1]/form/div[6]/div[2]/label[1]"#是否隔离
inCollege = "/html/body/div[1]/form/div[7]/div[2]/label[1]"#是否在校
submit = "/html/body/div[1]/form/div[8]/a"#提交
check = "/html/body/div[3]/div[2]/div[2]/a[2]"#最后的确定按钮

# 模拟登陆打卡
def do_login(driver):
    # driver.maximize_window() 将窗口最大化
    # 找到登录框 输入账号密码
    driver.find_element_by_name('userid').send_keys(userName)
    driver.find_element_by_name('userpwd').send_keys(password)
    driver.find_element_by_id('formSubmitBtn').click()#点击登录

    driver.find_element_by_xpath(movement).click()
    driver.find_element_by_xpath(touch).click()
    driver.find_element_by_xpath(condition).click()
    driver.find_element_by_xpath(quarantine).click()
    driver.find_element_by_xpath(inCollege).click()
    
    driver.find_element_by_xpath(submit).click()#点击提交
    time.sleep(2)
    driver.find_element_by_xpath(check).click()#点击确定
    time.sleep(1)

if __name__ == '__main__':
    # 模拟浏览器打开网站
    driver = webdriver.Chrome()
    driver.get(url)
    # 登录并打卡
    do_login(driver)
    print("打卡结束")
    time.sleep(1)#终端给你时间确认已经打卡成功
    driver.quit()

写完程序就可以打成exe啦,添加一下开机启动,或者不添加放桌面手动启动也很方便啊哈哈。打包exe教程

声明:本博客仅供学习交流使用,请勿将本博客所写内容用于违法行动。所造成的一切后果本博主并不承担

配置到服务器实现打卡全自动

自从写完这个程序我就在想,万一哪天我一个早上不用电脑,岂不是错过了打卡。或者还要为了打卡开一次电脑,岂不是更麻烦。大佬提供了一个思路:直接把程序放到服务器上,定时启动。哈哈哈哈妙啊!(明明是自己菜连这都想不到)

于是有了下面这篇博客将自己的打卡程序配置上服务器,完成全自动操作 so easy~

猜你喜欢

转载自blog.csdn.net/weixin_44559752/article/details/107634627