SHU每日两报脚本

1. 实现原理

利用python中的Selenium库,并结合浏览器驱动,来自动完成每日两报的操作,最后测试结果将每天的体温设置区间为36度至37度之间(含小数点后一位)。同时,在使用前可以自己选择相应的填报日期,也可以在特定日期之内完成相应的填报操作。

2. 使用教程

2.1. 使用步骤

1、首先,此程序基于python 3.8.5版本运行,使用的浏览器为Edge,版本号86.0.622.51 (Official build) (64-bit),IDE为PyCharm 2020.1.3 (Professional Edition) 2、打开命令行,使用pip指令安装selenium pip install selenium 3、通过浏览器官网下载相应的浏览器启动插件,将其设置为系统环境变量(可选),也可以在程序中自行设置浏览器启动驱动位置,如在E盘的E:\Edgedriver目录,就更改默认的地址 driverUrl = r"E:\Edgedriver\msedgedriver.exe" 4、运行程序时,请关闭其他任何可能影响浏览器运行的插件或者软件,如果网络信号不佳,则需要将time.sleep(1)中的数值调大,以等待网页的元素彻底加载成功

3. 代码实现

3.1. 准备工作

在本程序中,我使用了三个库,分别是selenium(主角),time以及random。 其次,设置好自己的浏览器驱动位置以及每日一报链接位置,并填写好自己的账号密码

1
2
3
4
5
6
7
myUsername=r'' #在此输入你的学号
myPassword=r'' #在此输入你的姓名
baseUrl=r'https://selfreport.shu.edu.cn/' #默认的每日两报地址
driverUrl = r"E:\Edgedriver\msedgedriver.exe" #浏览器驱动,这里以Edge示例,不同的浏览器可以去官网下载
from selenium #完成web自动化的一系列操作
import time #设置程序等待时间,等待浏览器加载元素完全
import random #设置温度随机数

3.2. 登录账号

准备好以上步骤以后,我们就可以打开浏览器并对其进行相应的操作。

输入代码

1
2
3
4
5
6
7
    driver = webdriver.Edge(driverUrl)#通过驱动器打开浏览器
    driver.get(baseUrl)#访问健康之路链接
    search_username = driver.find_element_by_id('username')#找到用户名位置
    search_username.send_keys(myUsername)#填写用户名
    search_password = driver.find_element_by_id('password')#找到密码位置
    search_password.send_keys(myPassword)#填写密码
    driver.find_element_by_id('submit').click()#找到元素并且自动点击登录

程序执行时,就会将自己的账号密码自动填入进入下章页面。

3.3. 进入报送历史界面

如图,需要点进报送历史: B8AzKH.png

首先输入

1
driver.find_element_by_id('lbReportHistory').click()#找到对应历史报送的按钮,点击

然后即可进入历史界面,在这里每天的报送记录罗列如下:

B8AX8O.png

3.4. 填写对应的信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 点击对应的天数:
object = str(date) + item
driver.find_element_by_partial_link_text(object).click()

# 勾选承诺项:
driver.find_element_by_id("p1_ChengNuo-inputEl-icon").click()

# 填写体温,随机在36.0-37.0之间
search_temperature = driver.find_element_by_id("p1_TiWen-inputEl")
temperature = str(random.randint(360, 370) / 10)
search_temperature.send_keys(temperature)

# 勾选状态"良好"
element = driver.find_element_by_id("fineui_0-inputEl")
driver.execute_script("arguments[0].click();", element)

# 当天随申码颜色:"绿色"
driver.find_element_by_id("fineui_7-inputEl-icon").click()
element = driver.find_element_by_id('fineui_7-inputEl-icon')
driver.execute_script("arguments[0].click();", element)
# webdriver.ActionChains(driver).move_to_element(element).click(element).perform()

# 明天是否到食堂就餐:"早餐,中餐,晚餐"
element = driver.find_element_by_id('fineui_8-inputEl-icon')
driver.execute_script("arguments[0].click();", element)
element = driver.find_element_by_id('fineui_9-inputEl-icon')
driver.execute_script("arguments[0].click();", element)
element = driver.find_element_by_id('fineui_10-inputEl-icon')
driver.execute_script("arguments[0].click();", element)

以上代码均是对于填写页面元素的捕捉,并对发现的第一个元素发起提交按钮。 在这里,程序代码不能写成如下:

1
2
3
4
5
# 以下操作无法实现,原因应该是元素定位相互覆盖。
# driver.find_element_by_id("fineui_8-inputEl-icon").click()
# driver.find_element_by_id("fineui_9-inputEl-icon").click()
# driver.find_element_bu_id("fineui_10-inputEl-icon").click()
# driver.find_element_by_id("p1_ctl00_btnSubmit").click()

原因是代码中的元素相互覆盖,无法实现操作 最终选择并点击时的效果如下: B8AOPK.png

3.5. 点击确认按钮

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 点击提交
element = driver.find_element_by_id("p1_ctl00_btnSubmit")
driver.execute_script("arguments[0].click();", element)
time.sleep(1)
# 点击确认
element = driver.find_element_by_id("fineui_14")
driver.execute_script("arguments[0].click();", element)
time.sleep(3)
element = driver.find_element_by_id("fineui_19")
# element = driver.find_element_by_class_name("f-btn-text")
driver.execute_script("arguments[0].click();", element)
time.sleep(1)

在这里我使用了time.sleep()函数,为了让程序停顿,原页面加载的过程中,会出现提交框晚出现的情况,所以需要让程序“等待”浏览器加载结束,最后填报。

4. 完整代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#-*- coding = utf-8 -*-
#@Time : 2020-10-25 15:24
#@Author : Jiancong Zhu
#@Email : 643601464@qq.com
#@File : release.py
#@Software: PyCharm

myUsername=r'' #在此输入你的学号
myPassword=r'' #在此输入你的姓名
baseUrl=r'https://selfreport.shu.edu.cn/' #默认的每日两报地址
driverUrl = r"E:\Edgedriver\msedgedriver.exe" #浏览器驱动,这里以Edge示例,不同的浏览器可以去个官网下载
from selenium
import time
import random

def main():
    print("Hello,")
    driver = webdriver.Edge(driverUrl)
    driver.get(baseUrl)
    search_username = driver.find_element_by_id('username')
    search_username.send_keys(myUsername)
    search_password = driver.find_element_by_id('password')
    search_password.send_keys(myPassword)
    driver.find_element_by_id('submit').click()

    for date in range(19,26,1):#在此修改你想实现的日期,左闭右开,如这里为[19,26),即19至25号
        for item in ['晨报','晚报']:
            # print("Hello, world!")
            # driver = webdriver.Edge(driverUrl)
            # driver.get(baseUrl)
            # driver.find_element_by_id('username')
            # search_username = driver.find_element_by_id('username')
            # search_username.send_keys(myUsername)
            # search_password = driver.find_element_by_id('password')
            # search_password.send_keys(myPassword)
            # driver.find_element_by_id('submit').click()

            # 进入报送历史:
            driver.find_element_by_id('lbReportHistory').click()

            # 点击对应的天数:
            object = str(date) + item
            driver.find_element_by_partial_link_text(object).click()

            # 勾选承诺项:
            driver.find_element_by_id("p1_ChengNuo-inputEl-icon").click()

            # 填写体温,随机在36.0-37.0之间
            search_temperature = driver.find_element_by_id("p1_TiWen-inputEl")
            temperature = str(random.randint(360, 370) / 10)
            search_temperature.send_keys(temperature)

            # 勾选状态"良好"
            element = driver.find_element_by_id("fineui_0-inputEl")
            driver.execute_script("arguments[0].click();", element)

            # 当天随申码颜色:"绿色"
            driver.find_element_by_id("fineui_7-inputEl-icon").click()
            element = driver.find_element_by_id('fineui_7-inputEl-icon')
            driver.execute_script("arguments[0].click();", element)
            # webdriver.ActionChains(driver).move_to_element(element).click(element).perform()

            # 明天是否到食堂就餐:"早餐,中餐,晚餐"
            element = driver.find_element_by_id('fineui_8-inputEl-icon')
            driver.execute_script("arguments[0].click();", element)
            element = driver.find_element_by_id('fineui_9-inputEl-icon')
            driver.execute_script("arguments[0].click();", element)
            element = driver.find_element_by_id('fineui_10-inputEl-icon')
            driver.execute_script("arguments[0].click();", element)

            # 以下操作无法实现,原因应该是元素定位相互覆盖。
            # driver.find_element_by_id("fineui_8-inputEl-icon").click()
            # driver.find_element_by_id("fineui_9-inputEl-icon").click()
            # driver.find_element_bu_id("fineui_10-inputEl-icon").click()
            # driver.find_element_by_id("p1_ctl00_btnSubmit").click()

            # 点击提交
            element = driver.find_element_by_id("p1_ctl00_btnSubmit")
            driver.execute_script("arguments[0].click();", element)
            time.sleep(1)
            # 点击确认
            element = driver.find_element_by_id("fineui_14")
            driver.execute_script("arguments[0].click();", element)
            time.sleep(3)
            element = driver.find_element_by_id("fineui_19")
            # element = driver.find_element_by_class_name("f-btn-text")
            driver.execute_script("arguments[0].click();", element)
            time.sleep(1)

    driver.quit()
    print("world!") # 输出Hello,world! 完美的结束

if __name__ == "__main__": #当程序执行时
    main() #开始