之前学习了selenium的安装和上手,现在来一次模拟登陆教务系统。有基础的同学可以直接拿走代码,去写抢课的脚本,但是估计效果不会蛮好。登陆页面如下
解除右键禁用
当然在此之前因为这个教务系统网站不能右键检查元素,所以我们用之前学的方法解除右键禁用
定位元素
首先检查元素发现这个登陆页面是作为一个iframe嵌在主页面中的,所以要想用selenium定位到这个登陆页面的元素的话,得先定位到iframe中
window.switch_to.frame('frm_login')
之后就是常规的获取元素,但是这里有个坑,就是在密码处有两个input,有一个是假的,最后会hidden,所以一开始我用这个假的填写密码就一直显示账号或者密码错误。直到我亲自模拟了一遍登录操作后才发现,一开始input1会隐藏,但是当鼠标点击密码框时,input2隐藏,input1就会出现了。所以真正充当密码框的是input1.下次模拟登陆时遇到两个input时最好模拟登陆一下看看这两个input的作用到底是什么
验证码处理
这个网站的验证码要先点击文本框,图片才能动态加载出来,而selenium可以很好地解决动态加载,这里的大致思路就是用截图获取验证码的图像,再交给超级鹰进行打码即可(当然超级鹰平台的使用我还没讲,之后基本操作我会发在我的博客里的。)。其实还是挺简单的。但是一开始我的思路错了,想着用requests获取图像,再打码。但是最后总是显示验证码不对。原因是因为用selenium已经请求过一次网站了,最后又用requests请求一次,必然会导致局部刷新,使获得的验证码与最后登录的验证码不匹配。当然如果是单纯的用requests的话,可以直接利用session,但是selenium我不知道如何使用,所以还是利用截图的方法吧,而操作起来发现截图好像更方便一点
弹窗处理
最后测试的时候发现可能会出现用户重复登录的情况,从而出现上面的弹窗,而这种一个按钮的属于alert弹出框,selenium中也有解决办法:
window.switch_to.alert.accept() #确认弹窗
最后把代码给一下(想看到浏览器操作过程的话就把无头浏览器那两行代码注掉):
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from lxml import etree
import time
from chaojiying import Chaojiying_Client #导入超级鹰打码
from selenium.webdriver.chrome.options import Options
#防止证书报错
options = webdriver.ChromeOptions()
options.add_argument('-ignore-certificate-errors')
options.add_argument('-ignore -ssl-errors')
#无头浏览器
options.add_argument('--headless')
options.add_argument('--disable-gpu')
s = Service(executable_path='./chromedriver') #找驱动
window = webdriver.Chrome(service=s,chrome_options = options) #指定浏览器
window.get('http://jwmis.hnie.edu.cn/jwweb/home.aspx') #访问该网址
window.switch_to.frame('frm_login') #获取到登录栏
user_name=window.find_element('id','txt_asmcdefsddsd') #获取用户账号框
user_name.click()
user_name.send_keys('这里填写你的学号')
time.sleep(1)
user_passw=window.find_element('id','txt_psasas') #终于明白这两个框是干嘛的了,用来骗你的,事实上点其中一个框之后另一个会被隐藏,所以真正作为密码框的是最后一个
user_pass=window.find_element('id','txt_pewerwedsdfsdff')
user_passw.click()
user_pass.send_keys('这里填写你的密码')
text=window.find_element('id','txt_sdertfgsadscxcadsads') #验证码框
login=window.find_element('id','btn_login') #获取登录键
text.click() #为的是动态加载验证码
img = window.find_element('id','imgCode') #定位验证码图片
img.screenshot('yzm.png') #提取图片
chaojiying = Chaojiying_Client('超级鹰平台账号', '密码', '你申请的软件id') #用户中心>>软件ID 生成一个替换 96001,第三个参数是指超级鹰你申请的软件ID
im = open('yzm.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
yzm=(chaojiying.PostPic(im, 1902))['pic_str'] #后面的1902是类型,看验证码是什么类型的,一般的数字+字母就不用改了
print(yzm)
time.sleep(1)
#进行登录操作
text.send_keys(yzm)
time.sleep(10)
login.click()
print("success")
#弹出框确认 三种弹出框alert(一个按钮),confirm(两个按钮),prompt(两个按钮+输入框)
window.switch_to.alert.accept() #确认弹窗
time.sleep(60)
window.quit()
踩坑不易,给个关注不过分吧?