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

news2024/12/27 11:34:36

在自动化测试的过程中,验证码一直被视为一个“拦路虎”。很多测试人员在做接口或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()

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C51】独立按键控制LED灯

1.简介 在单片机应用系统中&#xff0c;常常使用轻触按键组成键盘。轻触按键具有自动回弹的特点&#xff0c;即按下按键&#xff0c;两个触点接通&#xff0c;放开按键&#xff0c;两个触点断开。轻触按键的外形及电路符号如图&#xff0c;通常轻触按键有4个引脚&#xff0c;4个…

Redis - 深入理解Redis事务

目录 Redis是如何实现事务的&#xff1f;事务中执行的命令出现错误&#xff0c;会回滚事务吗&#xff1f;同一个连接可以重复开启事务吗&#xff1f;多个客户端同时开启事务会怎样&#xff1f;使用Redis事务只用MULTI和EXEC吗&#xff1f;Redis中的WATCH机制是怎么实现的&#…

GAMES104:13 引擎工具链基础-学习笔记

文章目录 一&#xff0c;工具链二&#xff0c;复杂的工具2.1 界面GUI2.2 设计模式Design Pattern2.3 数据的加载和存储2.4 资产引用 三&#xff0c;资产加载Deserialization3.1 资产解析Parse3.2 资产版本兼容性&#xff08;Compatibility&#xff09; 四&#xff0c; 如何制作…

搞安全必看——IPS和IDS到底有啥区别?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 随着数字化转型的加速推进&#xff0c;网络安全已成为各行业不可或缺的一环。对于现代企业和组织而言&#x…

【JavaEE初阶】多线程6(线程池\定时器)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 实例3:线程池 参数解释 核心线程数, 最大线程数 允许空闲的最大时间 ,时间单位 任务队列(阻塞队列) 线程工厂>工厂设计模式 拒绝策略 使用举例 模拟实现一个线…

从零开始讲DDR(0)——DDR的前世今生

一、计算机组成 计算机组成结构&#xff08;Computer Architecture&#xff09;是计算机系统的核心&#xff0c;它定义了计算机的基本工作原理和设计模式。计算机的组成可以分成以下3大类&#xff1a;中央处理器&#xff08;CPU&#xff09;、存储器和输入/输出子系统。 1.1 中…

Linux文件IO-基础知识了解及文件描述符

1、简介 本章给大家介绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、Outout&#xff09;&#xff0c;文件 I/O 指的是对文件的输入/输出操作&#xff0c;说白了就是对文件的读写操作&#xff1b;Linux 下一切皆文件&#xff0c;文件作为 Linux 系…

深度学习 之 常见损失函数简介:名称、作用及用法

引言 在机器学习和深度学习中&#xff0c;损失函数&#xff08;Loss Function&#xff09;是模型训练过程中一个不可或缺的部分。它用来度量模型预测结果与真实值之间的差异&#xff0c;从而指导模型参数的优化。合理选择损失函数对于提高模型的准确性和泛化能力至关重要。本文…

Mint Expedition Season 3 拉开帷幕:登顶高峰的时刻到了

自 7 月 15 日 Mint Expedition 启动以来&#xff0c;Mint&#xff0c;一条专注于 NFT 行业的以太坊 Layer 2&#xff0c;日常交易量和交易额都出现了爆发式增长。这一成功离不开 Mint 社区的合作&#xff0c;包括 Minters、Web3 去中心化应用程序的开发者&#xff0c;以及大量…

模电模块(一)

这个看起来功能挺全的&#xff0c;就是小贵&#xff0c;有时间自己做一个&#xff1a; 首页-康威科技-淘宝网 (taobao.com) 画一个集成板&#xff0c;集合上述模块的功能。

深圳国际VR/AR博览会圆满落下帷幕

近日&#xff0c;深圳国际VR/AR博览会在深圳国际会展中心2号馆圆满落下帷幕。该展会于9月11日至13日举行&#xff0c;是一个与光博会同期举行的大型盛会。 据主办方介绍&#xff0c;深圳国际VR/AR博览会&#xff08;Shenzhen International VR/AR Expo&#xff09;&#xff0c;…

力扣最热一百题——缺失的第一个正数

目录 题目链接&#xff1a;41. 缺失的第一个正数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;标记数组法 1. 将非正数和超出范围的数替换 2. 使用数组下标标记存在的数字 3. 找到第一个未标记的位置 4. 为什么时间复杂…

【与C++的邂逅】--- C++的IO流

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们来了解C中io流的相关知识。 &#x1f3e0; C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 sc…

数据处理与统计分析篇-day03-Numpy环境搭建

概述 python优势 Python作为当下最为流行的编程语言之一 可以独立完成数据分析的各种任务 数据分析领域里有海量开源库 机器学习/深度学习领域最热门的编程语言 在爬虫&#xff0c;Web开发等领域均有应用 常用开源库 numpy NumPy(NumericalPython) 是 Python 语言的一…

创客中国AIGC专题赛冠军天鹜科技:AI蛋白质设计引领者

“落霞与孤鹜齐飞,秋水共长天一色——这句出自《滕王阁序》的诗句,是我作为江西人熟记于心的佳句。它描绘的天地壮丽景色常浮现于我的脑海,正是这种豁达与壮观,启发我们将公司命名为‘天鹜科技’,我们希望将源自自然的蛋白质与现代科技的创新精神相结合,打造蛋白质设计与应用的…

OpenBayes 教程上新 | AI 时代的「神笔马良」,Hyper-SD 一键启动教程上线!

每次脑海中的画面栩栩如生&#xff0c;想画下来却难以下笔&#xff1f; 每次画完自己觉得非常像&#xff0c;但是旁人却一头雾水&#xff1f; 每次想用文生图&#xff0c;但不知道如何精确地输入 prompt&#xff1f; AI 时代的「神笔马良」Hyper-SD 来了&#xff01; 仅需简…

基本仪表放大器+基本电容耦合隔离放大器+OTA(基本OTA电路+OTA增益)

2024-9-18&#xff0c;星期三&#xff0c;21:37&#xff0c;天气&#xff1a;多云&#xff0c;心情&#xff1a;晴。大家中秋节都过的怎么样啊&#xff0c;如果没过爽也没有关系&#xff0c;因为再上八天班就能迎来10.1长假啦&#xff01;&#xff01;&#xff01;&#xff01;…

【机器学习】--- 自然语言推理(NLI)

引言 随着自然语言处理&#xff08;NLP&#xff09;的迅速发展&#xff0c;**自然语言推理&#xff08;Natural Language Inference, NLI&#xff09;**已成为一项重要的研究任务。它的目标是判断两个文本片段之间的逻辑关系。这一任务广泛应用于机器阅读理解、问答系统、对话…

五星级可视化页面(30):本系列最后一期,压轴出场。

不知不觉分享了30期高品质的五星级可视化大屏界面&#xff0c;该系列文章也该收尾了&#xff0c;本期为大家分享最后一批界面&#xff0c;我们下一个系列专辑见。

力扣之181.超过经理收入的员工

文章目录 1. 181.超过经理收入的员工1.1 题干1.2 准备数据1.3 题解1.4 结果截图 1. 181.超过经理收入的员工 1.1 题干 表&#xff1a;Employee -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | salary | int | | mana…