自动化中验证码的操作笔记,懂的赶紧收藏!

在自动化测试的过程中,验证码一直被视为一个“拦路虎”。很多测试人员在做接口或UI自动化时都会遇到验证码的阻碍,导致测试无法继续进行。今天,我们就来讨论如何在自动化过程中破解验证码,快速绕过这道关卡,轻松完成自动化测试任务!

如何通过程序实现验证码破解?有哪些工具和方法可以帮助我们在测试过程中自动识别验证码?

 

验证码的基本原理

验证码的设计目的是为了区分人类与机器人,因此具有一定的随机性和难度。常见的验证码类型包括数字验证码、图形验证码、滑块验证码等。对于自动化测试而言,识别这些验证码成为一个不可忽视的挑战。

  • 常用的破解方法

    • OCR技术:利用光学字符识别(OCR)技术,可以将图片中的文字转换为文本。目前比较成熟的OCR工具有Tesseract,它可以用来识别数字、字母验证码。
      • 示例:某电商平台在登录时要求输入数字验证码,测试人员通过Tesseract库,将验证码图片读取并转换为文本,从而顺利完成登录操作。
    • 通过API获取验证码:在某些系统中,验证码的生成是通过服务器端的API完成的。在这种情况下,可以通过抓包分析找到验证码接口,从而获取验证码的真实值,直接输入进行验证。
      • 示例:某系统的验证码是通过后台API生成,测试人员通过Fiddler抓取验证码接口,将验证码获取并用于登录。
    • 第三方打码平台:对于复杂的图形验证码或滑块验证码,可以使用第三方打码平台(如超级鹰、若快)进行识别。这些平台提供接口,自动化测试工具可以通过调用这些接口来获取验证码的识别结果。
      • 示例:在一次UI自动化测试中,某电商平台使用了滑块验证码,测试人员通过集成打码平台的API接口,自动识别滑块并完成测试。
  • 滑块验证码破解:滑块验证码需要通过模拟鼠标的移动轨迹来完成验证。在Python中,可以使用Selenium模拟拖动操作,并结合工具如OpenCV识别滑块位置。

    • 示例:在某登录系统中,测试人员通过Selenium模拟鼠标拖动滑块,并使用OpenCV分析滑块与背景图之间的差异,从而精准完成验证操作。

实战案例:

01  需求分析

1.打开一个chrome浏览器

2.输入论坛的网址

http://114.116.2.138:8090/forum.php

3.输入用户名admin

4.输入密码123456

5.点击登录

6.输入验证码

7.再点击登录

02 准备工作

selenium环境搭建

参考地址:

  1. python 必须要3.7+(因为dddocr和selenium4.0都要求)
  2. pycharm
  3. chrome 浏览器
  4. chromedriver 驱动(与浏览器版本要配套)
  5. 配置PATH中含有chromedriver所在目录
  6. 安装selenium第三方库

0操作步骤

第1步:导入webdriver模块

                

from selenium import webdriver

  • 前提:安装好selenium 环境

  • 需要了解:python导入语法

from 包名 import 模块

第2步:打开chrome浏览器

        

driver = webdriver.Chrome()  # 启动浏览器驱动

  • 用webdriver模块的Chrome类,对它实例化

  • Chrome首字符大写的,往往是Python中的类名

  • Chrome()这是一个实例化的过程

第3步:输入网址

driver.get("http://101.116.2.138:8090/forum.com")  # 打开网站

  • 字面翻译:使用driver.get()在浏览器上输入一个网址

    http://101.116.2.138:8090/forum.com

  • get是HTTP的一种请求方式

    (引申:学接口的要去懂更多的HTTP请求方式,POST/DELETE/PUT)

  • url的标准格式示例:

schema://[username:password@]IP|域名[:PORT]/资源?参数=参数值&参数=参数值
其中schema是协议,常见是http/https/file/FTP等

第4步:输入用户名|密码|点击登录

1 driver.find_element('css selector','#ls_username').send_keys('admin')
2 driver.find_element('css selector','#ls_password').send_keys('123456')
3 driver.find_element('css selector','', 'p.vm').click()

  • 要会chrome开发者工具

F12/右键检查/CTRL+SHIFT+I
INSPECTOR工具左上角的(箭头)\leftarrow,移动到元素上点击即可获取该元素的HTML源码

  • 要有HTML的基础

<input type="text" name="username" id="ls_username" autocomplete="off" class="pxvm" tabindex="901">
<标签名 属性名1=属性值1 属性名2=属性值2>文本</标签名>

  • find_element源码

def find_element(self, by=By.ID, value=None) -> WebElement:
    """
    定位元素的方法

    参数:
        by: 定位方式,有8种方式
            ID = "id"  # ID属性定位
            XPATH = "xpath"  # XPATH定位
            LINK_TEXT = "link text"  # 链接的文本
            PARTIAL_LINK_TEXT = "partial link text"  # 部分链接的文本定位
            NAME = "name"  # name属性定位
            TAG_NAME = "tag name"  # 标签名定位
            CLASS_NAME = "class name"  # class属性定位
            CSS_SELECTOR = "css selector"  # css选择器定位
        value: 对应方式的值
    """

  • 八个定位方法:id、css、xpath是最常用的

    • css参考:

      https://www.w3school.com.cn/cssref/css_selectors.asp

  • xpath参考:

    https://www.w3school.com.cn/xpath/xpath_axes.asp

  • WebElement 是ind_element的返回值,可以在这个元素上输入:

    • send_keys

    • 点击:click

    • 获取文本:text

第5步:验证码输入

获取验证码图片

ele_pic = driver.find_element(By.CSS_SELECTOR, "[id^='vseccode_c']>img")
with open('code.png', 'wb') as f:  # 打开code.png准备写入bytes数据
    f.write(ele_pic.screenshot_as_png)  # ele_pic.screenshot_as_png将当前这个元素的bytes数据写入

  • 注意用到了css定位的[属性^=属性开头的值]的语法

  • python读写文件的open方法

    • wb是write,bytes

  • ele_pic.screenshot_as_png:就是当前这个元素的bytes数据

  • 首次运行遇到错误

# Unable to locate element: {"method":"css selector", "selector":"[id^='vseccode_c']>img"}
# (Session info: chrome=103.0.5060.134)

  • 点击了登录后,弹出这个提示,获取验证码,无法定位

  • 点击操作往往会产生新的页面,新的页面加载的时候会出现延迟,这个时候等待就需要加入!!

  • 引申:selenium的等待

    • 强制:sleep

    • 隐式:implicitly_wait

    • 显式等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

分析验证码的数据

  • ddddocr的用法

  • 导入ddddocr

  • 实例化

  • 用classiication获取bytes数据的文本

import ddddocr  # 导入ddddocr库

ocr = ddddocr.DdddOcr()  # 实例化一个ocr对象

text = ocr.classification(ele_pic.screenshot_as_png)  # 用classification方法获取bytes数据的文本

输入验证码

  • 跟前面一样的,不再赘述

driver.find_element(By.CSS_SELECTOR, "[id^='seccodeverify_cS']").send_keys(text)

第6步:点击弹出框的登录

  • 跟前面一样的,不再赘述

driver.find_element(By.CSS_SELECTOR, ".pn.pnc[name='loginsubmit']").click()

验证码的出现是为了防止机器人攻击,尤其是在用户注册、登录等关键环节。对于企业来说,验证码不仅提高了安全性,也让自动化测试面临新的挑战。破解验证码的方法虽然有效,但也需要在合规和安全的前提下进行,避免被滥用。 

“验证码再强大,也难挡测试人员的智慧与工具!” ——合理运用工具与技术,让自动化测试更加轻松高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值