本文使用python的selenium模块实现一个自动打卡程序
文章目录
1、Selenium模块简介
这个模块允许我们使用py程序来操作Chrome、Firefox等主流浏览器,实现自动化测试。
我们要让电脑帮我们用浏览器做一件事情,就要告诉它先点哪里,输入什么内容,然后再点哪里。这个“点哪里”就是通过selenium模块的定位来实现的:
它提供了八种定位方法,感兴趣的朋友可以看一下。这里主要介绍程序中用到的三种:(具体使用方法在代码部分讲)
方法 | 作用 |
---|---|
find_element_by_id() | 通过元素的id定位 |
find_element_by_name() | 通过元素的name定位 |
find_element_by_xpath() | 通过元素的xpath定位 |
这个id、name和xpath是什么呢?其实就是网页中某个内容的属性。
我们知道一个网页是由许多元素组成的,比如你正在浏览的这个博客,其中有博主我的头像、你正在看的文字、左下角的点赞按钮等等等等。程序员在写网页的时候,为了方便使用辨别这些元素,会给元素加上不同的id和name,就像我们的名字一样。
name和id的区别在于,name就像我们的名字,而id像我们的身份证号。可能有重名的人,但没有同样的身份证号。(这么说并不严谨,但是姑且这么理解吧 其它的区别对于这个程序也不是很重要 )值得注意的是,并不是每一个元素都要有name或者id属性。所以我们还需要第三种方法xpath定位
比如你正在浏览的这个博客,使用Google或者其他浏览器按下F12,点击element查看源代码,有的标签是这样的:我们说的
可以看到上图的input标签既有id这个属性,又有name这个属性。
2、安装selenium以及浏览器驱动
2.1、安装selenium
由于国外的镜像源安装Python速度较慢,选择国内的镜像速度较快,
常用镜像源:
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
安装的时候执行以下命令(以阿里云镜像为例)
pip install Selenium -i http://mirrors.aliyun.com/pypi/simple/
2.2、安装浏览器驱动
selenium本身不具有打开浏览器的能力,需要各个浏览器的驱动配合。接下来我们安装一个浏览器驱动:下载之前查清楚自己浏览器的版本!
这里以Mac端为例:
打开谷歌浏览器后,在屏幕的左上角处
点击此处打卡下拉框
打开后就可以看到浏览器的具体版本了
Chrome浏览器版本对应
Chrome各种版本驱动下载
其他浏览器可以自行百度下载地址
下载完浏览器驱动,还需要配置一下环境变量让你的程序能找得到这个驱动:(环境变量里存的路径就是告诉电脑,在需要运行某个程序的时候可能可以去哪里找。系统在收到一个程序运行命令以后,会到这个环境变量表里一个个路径查看有没有你要的程序)
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将你的驱动存放路径如“E:\ChromeDriver”目录添加到Path的值中。比如:Path字段;E:\ChromeDriver
配置完环境变量,在一会所使用的代码中就可以获取到浏览器驱动driver了:
driver = webdriver.Chrome()
若没有配置环境变量,可以使用绝对路径的方式获取浏览器驱动driver:
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
3、模拟鼠标点击、填写信息
以下面这个网页为例,我需要填写学号、密码然后点击“登陆”按钮。那么首先,如何在使用程序来定位这几个需要填写/点击的位置?用上面介绍的方法!
模拟信息的填写,以填写学号为例
在此处鼠标右击,点击检查
在弹出的控制台中就可以找到该元素所拥有的属性
我们可以看到这个input输入框中有一个name属性,有一个id属性,那么我们就可以使用代码来进行填写信息:
1、使用name属性
driver.find_element_by_name('username').send_keys('你的学号')
2、使用id属性
driver.find_element_by_id('dl').send_keys('你的学号')
模拟按钮的点击,以登录按钮为例:
首先对要进行操作的按钮进行检查,定位到我们要操作的标签位置
在控制台中显示出以下信息
可以看到这个按钮有一个id属性,那么我们可以根据driver的相应方法来进行操作
driver.find_element_by_id('dl').click()
那么这时候问题来了,如果我们的标签元素中既没有id属性,也没有name属性呢,此时可以使用xpath来定位
4、XPath定位
在使用XPath之前,我们需要在浏览器中安装这个插件
XPath Helper
提取码:nhjk
下载完成后解压文件,可以看到里面有两个文件
我们打开Chrome浏览器,找到扩展程序
在右上角打开开发者模式
然后将crx文件直接拖入即可
安装完成后,在某个元素标签处右击打开扩展栏,找到复制完整XPath,Windows电脑为Copy Full XPath
找到登录按钮的xpath以后,我们将其存在一个变量中(因为直接使用会很长,当然你直接粘贴到相应位置也没啥问题),然后就可以使用代码模拟点击了
login = "/html/body/form/div/div/div[2]/a"
driver.find_element_by_xpath(submit).click()
一处细节,可能有的同学的网站是点击登录按钮后,等一会才能进入打卡页面,可以先让程序睡一会再继续执行
driver.find_element_by_xpath(submit).click()
time.sleep(2)
5、配置邮箱
如果不需要发送邮件的话就可以省略这个步骤,下面以QQ邮箱为例:
打开邮箱首页后点击左上角的设置按钮
点击账户模块
往下滑动找到此处
生成后大家记得先保存在一处!!!!一会代码中用得到
6、完整代码
# -*- coding: utf-8 -*-
import time
from selenium import webdriver
import smtplib
from email.mime.text import MIMEText
# 只需修改下面三项即可 学号 密码 打卡网址
username = "你的学号"
password = "你的密码"
url = "打卡网址"
# 下面是每次填报的时候几个需要填写的地方,F12找到这些位置的 full XPath
position = "/html/body/form/div/div/div[1]/div[8]/div[2]/div[1]/p/a" # 获取位置按钮
submit = "/html/body/form/div/div/div[2]/a" # 提交按钮
passwordXpath = "/html/body/div/div[3]/div[2]/div/div[2]/div/div[1]/form/div[3]/div/input[1]"
# 模拟登陆打卡
def do_login(driver):
try:
# 将窗口最大化
driver.maximize_window()
# 找到登录框 输入账号密码
driver.find_element_by_name('username').send_keys(username)
driver.find_element_by_xpath(passwordXpath).send_keys(password)
driver.find_element_by_id('dl').click() # 点击登录
# 延时一秒
time.sleep(1)
# 获取位置
driver.find_element_by_xpath(position).click()
# 点击最后的提交按钮
driver.find_element_by_xpath(submit).click()
except Exception as e:
print("出现错误了",e)
def send_email():
# 设置服务器所需信息
# qq邮箱服务器地址
mail_host = 'smtp.qq.com'
# qq用户名
mail_user = '你的邮箱'
# 密码(部分邮箱为授权码)
mail_pass = '申请的授权码'
# 邮件发送方邮箱地址
sender = '发送者邮箱'
# 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['接受者邮箱']
# 设置email信息
# 邮件内容设置
message = MIMEText('今日份打卡成功!!!', 'plain', 'utf-8')
# 邮件主题
message['Subject'] = '自动化打卡成功'
# 发送方信息
message['From'] = sender
# 接受方信息
message['To'] = receivers[0]
# 登录并发送邮件
try:
smtpObj = smtplib.SMTP_SSL(mail_host)
# 连接到服务器
smtpObj.connect(mail_host, 465)
# 登录到服务器
smtpObj.login(mail_user, mail_pass)
# 发送
smtpObj.sendmail(sender, receivers, message.as_string())
# 退出
smtpObj.quit()
print('发送邮件成功')
except smtplib.SMTPException as e:
print('发送邮件失败', e)
if __name__ == '__main__':
# 模拟浏览器打开网站
driver = webdriver.Chrome()
driver.get(url)
# 登录并打卡
do_login(driver)
# 给邮箱发送邮件
send_email()
print("打卡结束")
time.sleep(1) # 终端给你时间确认已经打卡成功
driver.quit()
写完程序就可以打成exe了,添加一下开机启动,或者不添加放桌面手动启动也很方便。
声明:本博客仅供学习交流使用,请勿将本博客所写内容用于违法行动。所造成的一切后果本博主并不承担