0 前言
我们学校在放假结束后统一要填写一个网页的返校报备表单,这个表单很啰嗦很长,最重要的是在提交前不能保存,也就是说一个误操作长长的表单就要重填了,烦不胜烦。
[好家伙,我返校前把表单填了足足三遍,填一遍约么10分钟吧]
就不能把每次都是一样的存在网页上吗?诸如学号、手机号之类的,每次都要填一遍真的很浪费时间欸。那好,学校不做我来做!
1 初始化环境
- 安装python 3
- 安装selenium库
pip install selenium
- 安装浏览器Chrome
- 安装Chrome驱动,下载链接
1. 1 安装Chrome驱动的步骤
有小小复杂,不过问题不大
第一步 获取Chrome的版本号
第二步 在该链接中找对应的版本号
这里有个小Bug:我的版本号是88.0.4324.190
这里只能找到88.0.4324.27和88.0.4324.96,不过没关系最后面那位数字最接近190且前面3位都相同的就行
我选的是:88.0.4324.96第三步 点进去,下载该版本号对应的系统版本
下载好之后,文件夹里面只有这个东西,解压出来:
第四步 把驱动文件复制到与 chrome.exe 相同路径下的文件夹
和 python.exe 也放到一起
1.2 检验环境是否配置完成
运行一下下面的代码即可
from selenium import webdriver
# 启动谷歌浏览器
web = webdriver.Chrome()
如果谷歌浏览器启动了,那恭喜你,环境配置成功了
2 上代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 初始化变量
username = "201986110448"
password = "123456"
major = "19级 数学与应用数学4班"
Phone_Number = "13960011513"
Reason_for_going_out = "出校门吃炸鸡"
Going_out_data = "2021-03-01"
Going_out_time = "12:00"
Coming_back_data = "2021-03-01"
Coming_back_time = "13:00"
Destination = "五山广场"
# 启动谷歌浏览器
web = webdriver.Chrome()
# 登录华农官网,进入信息门户
web.get("http://www.scau.edu.cn")
web.find_element_by_xpath('//*[@id="headtop"]/div/div/div[3]/div/ul/li[1]/a').click()
# 切换到新的网页窗口
n = web.window_handles # 获取当前页句柄
# print(n)
web.switch_to.window(n[1]) # 切换到新的网页窗口
web.maximize_window() #最大化窗口
# 填写用户名和密码
web.find_element_by_name('username').send_keys(username)
web.find_element_by_name("password").send_keys(password)
web.find_element_by_xpath('//*[@id="fm1"]/div[5]/input[4]').click()
#进入办事服务大厅
web.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/div/ul/li[2]/a').click()
# 切换到新的网页窗口
n = web.window_handles # 获取当前页句柄
web.switch_to.window(n[2]) # 切换到新的网页窗口
# 进入报备页面:在校学生临时出入校园报备(疫情防控期间)
web.find_element_by_xpath('//*[@id="gnameC"]').send_keys("在校学生临时出入校园报备")
web.find_element_by_xpath('//*[@id="header"]/div/input[2]').click()
web.find_element_by_xpath('//*[@id="guideDiv"]/a/div').click()
# 切换到新的网页窗口
n = web.window_handles # 获取当前页句柄
web.switch_to.window(n[3]) # 切换到新的网页窗口
# 开始报备
web.find_element_by_xpath('//*[@id="b"]').click()
# 切换到新的网页窗口
n = web.window_handles # 获取当前页句柄
web.switch_to.window(n[4]) # 切换到新的网页窗口
# 设置延时等待页面加载完成
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[4]/form/div/div[2]/div[3]/div/div[1]/div[1]/table/tbody/tr[2]/td/div/table/tbody/tr[3]/td/div[2]/font/input')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[4]/form/div/div[1]/div[2]/ul/li[8]/a/nobr')))
# print(web.title)
# 开始报备2
web.find_element_by_xpath('/html/body/div[4]/form/div/div[2]/div[3]/div/div[1]/div[1]/table/tbody/tr[2]/td/div/table/tbody/tr[3]/td/div[2]/font/input').click()
web.find_element_by_xpath('/html/body/div[4]/form/div/div[1]/div[2]/ul/li[8]/a/nobr').click()
# 设置延时等待页面加载完成
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL53"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL6"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL10"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL13"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL14"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL15"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL16"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL38"]')))
WebDriverWait(web, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="V1_CTRL19"]')))
# 填表ing
web.find_element_by_xpath('//*[@id="V1_CTRL53"]').click()
web.find_element_by_xpath('//*[@id="V1_CTRL6"]').send_keys(major)
web.find_element_by_xpath('//*[@id="V1_CTRL10"]').send_keys(Phone_Number)
web.find_element_by_xpath('//*[@id="V1_CTRL13"]').send_keys(Going_out_data)
web.find_element_by_xpath('//*[@id="V1_CTRL14"]').send_keys(Going_out_time)
web.find_element_by_xpath('//*[@id="V1_CTRL15"]').send_keys(Coming_back_data)
web.find_element_by_xpath('//*[@id="V1_CTRL16"]').send_keys(Coming_back_time)
web.find_element_by_xpath('//*[@id="V1_CTRL38"]').send_keys(Reason_for_going_out)
web.find_element_by_xpath('//*[@id="V1_CTRL19"]').send_keys(Destination)
# 提交表单 (第一次建议手动提交,万一填错了,呵呵呵)
# web.find_element_by_xpath('/html/body/div[4]/form/div/div[1]/div[2]/ul/li[8]/a/nobr').click()
那些密码什么的都是假的,自己改成自己的用就是了。
3 小结
事实上,如果只填一次表的话,做这东西不划算。这码我打了两个多小时。可如果有很多人需要,或者这个表要填很多次,那就“值回票价了”
另外,这个东西需要有一台电脑,也不太方便。像这种自动化工具,如果能配合一台服务器,需要报备时直接用手机向服务器发送请求,让服务器去做,那就只要手上有部手机都可以用,这就方便多了。