侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python selenium UI自动化解决验证码的4种方法

Python  /  管理员 发布于 7年前   204

本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下:

测试环境

  1. windows7+
  2. firefox50+
  3. geckodriver # firefox浏览器驱动
  4. python3
  5. selenium3

selenium UI自动化解决验证码的4种方法:去掉验证码、设置万能码、验证码识别技术-tesseract、添加cookie登录,本次主要讲解验证码识别技术-tesseract和添加cookie登录。

1. 去掉验证码

去掉验证码,直接通过用户名和密码登陆网站。

2. 设置万能码

设置万能码,就是不管什么情况,输入万能码,都可以成功登录网站。

3. 验证码识别技术-tesseract

准备条件

  1. tesseract,下载地址:https://github.com/parrot-office/tesseract/releases/tag/3.5.1
  2. Python3.x,下载地址:https://www.python.org/downloads/
  3. pillow(Python3图像处理库)

安装好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, result, '-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, TEMP_RESULT_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+opencv轮廓检测代码解析
    下一条:
    OpenCV-Python实现轮廓检测实例分析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客