selenium的webdriver来自动填报每日健康日报

起因

健康平台每天要求填报两次,每次还有时间限制,一次不填就成黄🐎了,写一个脚本,这里偷懒了,懒得去弄cas登陆那一套跳转,就直接懒狗selenium去弄了。

关键点

安装selenium

首先是安装selenium,windows的话有chrome就问题不大,在设置里面看看自己的版本,然后去http://chromedriver.storage.googleapis.com/index.html下载相应的驱动

这里下载下来后我看网上说放到C盘谷歌服务文件夹地下,不太行,我最后是放在了python的PATH地下,anaconda的话就是根目录的Script文件夹下,直接把可执行文件放进去就行,然后使用以下代码测试,如果没有报错说明驱动安装成功了

1
2
3
4
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('headless')
driver=webdriver.Chrome(chrome_options=option)

Linux版本的安装就搜教程即可,问题不大

延时的必要性

个人感觉这个是因为selenium本质是调用谷歌浏览器进行模拟,所以必定会有中间跳转的延时。

在登陆跳转的时候,延时是必须的,不然搜索不到下一个的界面。

跳转时的页面切换

1
2
3
4
windows = driver.window_handles

driver.switch_to.window(windows[-1])
print('当前页面title',driver.title)

这个可以检测是否跳转成功,有时候图形化界面看到的不一定是程序拿到的页面,这里相当于一个队列,直接跳转到最后一个,想要跳转回去就往前移。

iframe问题

iframe真是一个神奇的东西,我在浏览器复制好xpath,结果代码执行找不到,原因是用了iframe,这个相当于另外的一个htm,需要进行跳转

driver.switch_to.frame(driver.find_element_by_xpath("/html/body/div[2]/div[2]/table/tbody/tr/td[2]/div[2]/div/iframe"))

这里使用这个进行切换,xpath是新的iframe的xpath,这样就可以切换到iframe内部的htm了,然后填表,填完之后切换回去。

driver.switch_to.default_content()

代码

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
import time
import os
from selenium import webdriver
#先安装pywin32,才能导入下面两个包
import win32api
import win32con
#导入处理alert所需要的包
from selenium.common.exceptions import NoAlertPresentException
import traceback


option = webdriver.ChromeOptions()
option.add_argument('headless')
#这里是重点,增加一个参数即可实现在不打开浏览器的情况下完成系列操作

driver=webdriver.Chrome(chrome_options=option) # 选择Chrome浏览器
driver.get('http://one2020.xjtu.edu.cn/EIP/nonlogin/user/index.htm') # 打开网站

#driver.maximize_window() #最大化谷歌浏览器
driver.find_element_by_link_text('登录 / SIGN IN').click()
time.sleep(2)
windows = driver.window_handles

driver.switch_to.window(windows[-1])
print('当前页面title',driver.title)
driver.find_element_by_xpath('//*[@id="form1"]/input[1]').click() # 点击用户名输入框
driver.find_element_by_xpath('//*[@id="form1"]/input[1]').clear() #清空输入框
driver.find_element_by_xpath('//*[@id="form1"]/input[1]').send_keys('your_netid') # 自动敲入用户名

driver.find_element_by_name('pwd').click() # 点击密码输入框
driver.find_element_by_name('pwd').clear() #清空输入框
driver.find_element_by_name('pwd').send_keys('your_pwd') # 自动敲入密码

driver.find_element_by_xpath('//*[@id="account_login"]').click()


time.sleep(2)

#print('当前页面title',driver.page_source)
driver.get('http://one2020.xjtu.edu.cn/EIP/cooperative/openCooperative.htm?flowId=4af591a971bc5d460171e279f192078d')
time.sleep(2)
windows = driver.window_handles
driver.switch_to.window(windows[-1])

#time.sleep(2)
#driver.find_element_by_id('sendBtn').click()
#print('当前页面title',driver.page_source)
driver.switch_to.frame(driver.find_element_by_xpath("/html/body/div[2]/div[2]/table/tbody/tr/td[2]/div[2]/div/iframe"))

driver.find_element_by_xpath('/html/body/div/div/span[2]/div/table/tbody/tr/td/div[1]/div[3]/input').click()
driver.find_element_by_xpath('/html/body/div/div/table/tbody/tr[13]/td[2]/span/span[1]/input').click() # 点击用户名输入框
driver.find_element_by_xpath('/html/body/div/div/table/tbody/tr[13]/td[2]/span/span[1]/input').clear() #清空输入框
driver.find_element_by_xpath('/html/body/div/div/table/tbody/tr[13]/td[2]/span/span[1]/input').send_keys('36.5') # 自动敲入用户名
driver.switch_to.default_content()
driver.find_element_by_id('sendBtn').click()

driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[2]/div[2]/a[1]/span').click()
driver.quit()
exit(0)


结尾

想起来很简单的脚本实现起来还是遇到了一定问题,动手实践才可以更好的了解web架构,学校这一套系统跟我之前见过的htm+php还真的不一样,跳转连接复制出来都是void(0),填报日报的通信路由还是bp抓包分析来的,可能大型项目现在都这样写了吧。

参考

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2023 galaxy
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信