前言
在实现自动化测试时,最为困难的就是验证码处理;那么常规的验证码都进行处理和识别,那么如果是类似12306等图片识别的验证码的话如何实现?那么今天小编就给大家分析下12306验证码如何实现自动化。
获取12306验证码图片
按照常规思路无非两种,将截取的验证码图片发送给第三方服务器,然后通过第三方服务器进行识别后将结果进行返回;要么就是自己通过机器识别的方式不断进行学习,写大量的识别库然后完成识别操作;第二种方式耗时耗力,显然不可取,所以大部分都是选择第三方服务器进行完成;
验证码图片的获取可以通过传统的Pillow模块完成图片的截取操作;但是此种方式会出现失真(是图片的质量下降,模糊),所以此处为了提高其图片的质量,可以直接获取图片的文件流对象,然后自己将文件流对象转换成图片的过程;
通过分析系12306页面,使用元素定位发现验证码的src属性是可以直接获取对应图片通过base64加密的数据流,如果能够将此数据流转换成字节流,然后保存成图片不就获取到原始图片了。
那么获取到src属性的结果值则可以通过下面代码完成:
self.get_code_elment=WebDriverWait(self.get_driver,5).until(lambda driver:driver.find_element_by_id("J-loginImg"))
get_src=self.get_code_elment.get_attribute("src")
但是得到的结果是base64编码数据流,所以可以通过base模块完成数据流转换成字节流,定义一个方法封装后即可获取到对应验证码图片
def get_code_image(self):
self.get_driver.find_element_by_class_name("login-hd-account").click()
try:
self.get_code_elment=WebDriverWait(self.get_driver,5).until(lambda driver:driver.find_element_by_id("J-loginImg"))
#此处src数据加载问题
time.sleep(3)
get_src=self.get_code_elment.get_attribute("src")
#得到base64格式编码数据
get_base64=get_src.split(",")[-1]
#获取到bytes对象,文件、图像实际都是基于byte流
get_byte