本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下:
测试环境
windows7+ firefox50+ geckodriver # firefox浏览器驱动 python3 selenium3selenium UI自动化解决验证码的4种方法:去掉验证码、设置万能码、验证码识别技术-tesseract、添加cookie登录,本次主要讲解验证码识别技术-tesseract和添加cookie登录。
1. 去掉验证码
去掉验证码,直接通过用户名和密码登陆网站。
2. 设置万能码
设置万能码,就是不管什么情况,输入万能码,都可以成功登录网站。
3. 验证码识别技术-tesseract
准备条件
安装好Python,通过pip install pillow安装pillow库。然后将tesseract中的tesseract.exe和testdata文件夹放到测试脚本所在目录下,testdata中默认有eng.traineddata和osd.traineddata,如果要识别汉语,请自行下载对应包。
以下是两个主要文件,TesseractPy3.py是通过python代码去调用tesseract以达到识别验证码的效果。code.py是通过selenium获取验证码图片,进而使用TesseractPy3中的函数得到验证码,实现网站的自动化登陆。
TesseractPy3.py
#Coding=utf-8import osimport subprocessimport tracebackimport loggingfrom PIL import Image # 来源于Pillow库TESSERACT = 'tesseract' # 调用的本地命令名称TEMP_IMAGE_name = "temp.bmp" # 转换后的临时文件TEMP_RESulT_name = "temp" # 保存识别文字临时文件CLEANUP_TEMP_FLAG = True # 清理临时文件的标识INCOMPATIBLE = True # 兼容性标识def image_to_scratch(image,TEMP_IMAGE_name): # 将图片处理为兼容格式 image.save(TEMP_IMAGE_name,dpi=(200,200))def retrIEve_text(TEMP_RESulT_name): # 读取识别内容 inf = open(TEMP_RESulT_name + '.txt','r') text = inf.read() inf.close() return textdef perform_cleanup(TEMP_IMAGE_name,TEMP_RESulT_name): # 清理临时文件 for name in (TEMP_IMAGE_name,TEMP_RESulT_name + '.txt',"tesseract.log"): try: os.remove(name) except OSError: passdef call_tesseract(image,result,lang): # 调用tesseract.exe,将识读结果写入output_filename中 args = [TESSERACT,image,'-l',lang] proc = subprocess.Popen(args) retcode = proc.communicate()def image_to_string(image,lang,cleanup = CLEANUP_TEMP_FLAG,incompatible = INCOMPATIBLE): # 假如图片是不兼容的格式并且incompatible = True,先转换图片为兼容格式(本程序将图片转换为.bmp格式),然后获取识读结果;如果cleanup=True, *** 作之后删除临时文件。 logging.basicConfig(filename='tesseract.log') try: try: call_tesseract(image,TEMP_RESulT_name,lang) text = retrIEve_text(TEMP_RESulT_name) except Exception: if incompatible: image = Image.open(image) image_to_scratch(image,TEMP_IMAGE_name) call_tesseract(TEMP_IMAGE_name,lang) text = retrIEve_text(TEMP_RESulT_name) else: raise return text except: s=traceback.format_exc() logging.error(s) finally: if cleanup: perform_cleanup(TEMP_IMAGE_name,TEMP_RESulT_name)
code.py
#Coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.ui import Selectfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.common.exceptions import NoAlertPresentExceptionfrom PIL import Imageimport unittest,time,refrom TesseractPy3 import *class lgoin(unittest.TestCase): def setUp(self): self.driver = webdriver.IE() self.driver.implicitly_wait(30) self.base_url = 'http://127.0.0.1:8080/test' # 要测试的链接 self.Title = '某管理平台' # 测试网站的Title self.verificationErrors = [] self.accept_next_alert = True def test_lgoin(self): driver = self.driver driver.get(self.base_url) driver.maximize_window() driver.save_screenshot('All.png') # 截取当前网页,该网页有我们需要的验证码 imgelement = driver.find_element_by_class_name('kaptchaimage') location = imgelement.location # 获取验证码x,y轴坐标 size = imgelement.size # 获取验证码的长宽 rangle = (int(location['x']),int(location['y']),int(location['x']+size['wIDth']),int(location['y']+size['height'])) # 写成我们需要截取的位置坐标 i = Image.open("All.png") # 打开截图 result = i.crop(rangle) # 使用Image的crop函数,从截图中再次截取我们需要的区域 result.save('result.jpg') text = image_to_string('result.jpg','eng').strip() assert self.Title in driver.Title driver.find_element_by_ID(u'userCode').clear() driver.find_element_by_ID(u'userCode').send_keys('XXXXXX') # 用户名 driver.find_element_by_ID(u'password').clear() driver.find_element_by_ID(u'password').send_keys('XXXXXX') # 密码 #driver.find_element_by_name('verifyCode').clear() driver.find_element_by_name('verifyCode').send_keys(text) driver.find_element_by_name('submit').submit() def is_element_present(self,how,what): try: self.driver.find_element(by=how,value=what) except NoSuchElementException as e: return False return True def is_alert_present(self): try: self.driver.switch_to_alert() except NoAlertPresentException as e: return False return True def close_alert_and_get_its_text(self): try: alert = self.driver.switch_to_alert() alert_text = alert.text if self.accept_next_alert: alert.accept() else: alert.dismiss() return alert_text finally: self.accept_next_alert = True def tearDown(self): #self.driver.quit() self.assertEqual([],self.verificationErrors)if __name__ == "__main__": unittest.main()
最后,执行命令python code.py,就可以成功自动登录网站。
注意:
由于受验证码图片质量以及清晰度的影响,并不是每一次都能成功登陆。
4. 添加cookie登录
首先获取网站登陆后的cookie,然后通过添加cookie的方式,实现网站登陆的目的。我们用cook来表示xxxxxx的登录后的cookie。
# Coding=utf-8from selenium import webdriverimport time driver = webdriver.firefox()driver.get("http://www.xxxxxx.com/") # 要登陆的网站driver.add_cookie(cook) # 这里添加cookie,有时cookie可能会有多条,需要添加多次time.sleep(3) # 刷新下页面就可以看到登陆成功了driver.refresh()
注意:
登录时有勾选下次自动登录的请勾选,浏览器提示是否保存用户密码时请选择确定,这样获取的cookie成功登陆的机率比较高
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的python selenium UI自动化解决验证码的4种方法全部内容,希望文章能够帮你解决python selenium UI自动化解决验证码的4种方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)