多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

Selenium+Tesseract破解登录验证码-自动化测试

更新时间:2022-03-21 09:56:26 作者:多测师 浏览:399

  1 安装Tesseract

  1.1 下载Tesseract。地址为:Windows Installer made with MinGW-w64,下载完直接安装即可,安装完成后配置一下环境变量。编辑一下系统变量里的path,添加如下环境变量。

  C:\Program Files(x86)\Tesseract-OCR

  安装完成后,在cmd命令行窗口输入:

  tesseract -v

  1.2 安装pytesseract

  pip install pytesseract

Selenium+Tesseract破解登录验证码-自动化测试

  2 识别代码

  2.1 识别逻辑。首先使用selenium到浏览器找到验证码标签,然后截图保存下来,再用tesseract去识别这张图片。如果识别失败,再用selenium点击一下验证码图片,重新生成一张验证码,再重复之前的识别逻辑。如果识别成功,使用eval计算出算式的数值,填入后点击登录按钮。

  2.2 代码

  import time

  import pytesseract

  from selenium.webdriver import Chrome

  from PIL import Image

  driver = Chrome(executable_path=r'D:\Chrome Downloads\chromedriver.exe') # chromedriver的存放路径

  url = "http://60.210.111.130:8002/Login.aspx"

  print("开始爬取,url为{}".format(url))

  driver.get(url=url)

  time.sleep(2)

  # 找到username的input标签,填入用户名

  username = driver.find_element_by_id('txtUserName')

  username.clear()

  username.send_keys('your username')

  # 找到password的input标签,填入密码。如果再次点击验证码时密码被清空,那么这段代码要放到while循环内部

  password = driver.find_element_by_id('pwd')

  password.clear()

  password.send_keys('your password')

  # 进行20次尝试

  times = 0

  while True:

  try:

  element = driver.find_element_by_id('validimg')

  element.click()

  # 每次请求的验证码图片都不一样,所以只能截图,保存至本地。

  driver.save_screenshot('validImage.png')

  # windows系统要注意页面缩放比例,如果是150%,那么每项都*1.5。linux系统不需要

  left = element.location['x']*1.5

  top = element.location['y']*1.5

  right = element.location['x']*1.5 + element.size['width']*1.5

  bottom = element.location['y']*1.5 + element.size['height']*1.5

  im = Image.open('validImage.png')

  im = im.crop((left, top, right, bottom)) # 抠图

  im.save('validImage.png')

  data = pytesseract.image_to_string(Image.open('validImage.png'))

  if len(data) < 3: # 未识别

  continue

  if len(data) == 4: # 识别的带=号,去掉=号

  data = data[:3]

  if data[1] == ".": # -号经常别识别成.,替换为-号

  data[1] = "-"

  print("ocr识别结果", data)

  valid_code = driver.find_element_by_id('validcode')

  valid_code.clear()

  valid_code.send_keys(eval(data))

  time.sleep(1)

  btnLogin = driver.find_element_by_id('btnLogin')

  btnLogin.click()

  # 获取cookie

  login_cookie = driver.get_cookie('ASP.NET_SessionId')

  total_cookie = 'ASP.NET_SessionId={}; autoLogin=null; user=null; pwd=null'.format(login_cookie['value'])

  print("total_cookie,{}".format(total_cookie))

  break

  except Exception as e:

  time.sleep(2)

  times += 1

  print("破解验证码失败,重试第{}次".format(times))

  if times == 20:

  raise RuntimeError

  # linux系统要注意退出chromedriver。否则如果多次执行的话,会生成大量的chromedriver进程。

  driver.quit()

  其中比较坑的一点就是,windows系统显示有缩放比例。可以在桌面右键-显示设置-缩放与布局中看到。如果缩放比例是150%的话,那么截图部分,每项参数都要*1.5,否则截不到想要的验证码。

  以上内容为大家介绍了自动化测试中Selenium+Tesseract破解登录验证码,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部