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

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

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

相关文章

LVM硬盘挂载

LVM硬盘挂载 一、基础概念 sda/sdb/nvme0n1/nvme0n2&#xff1a; 硬盘的命名方式&#xff0c;中括号的字母为第三位按不同硬盘的加载顺序排序。sda1/sda2/sdb1&#xff1a; 第4位为分区号&#xff0c;数字为不同分区的依序命名lvm: LVM是一种逻辑卷管理器&#xff0c;允许管理…

黑马头条day1 环境搭建 SpringCloud微服务(注册发现,服务调用,网关)

Nacos 环境搭建 Vmvare打开已经安装好的虚拟机镜像环境 使用findshell作为链接工具 和MobaXterm差不多 初始工程搭建 项目导入到idea 里边 这个项目都是用的比较老的东西 jdk1.8 甚至把仓库也提供好了 主体机构 common 就是通用的配置 feign 是对外的接口 model …

css五种定位总结

在 CSS 中&#xff0c;定位&#xff08;Positioning&#xff09;主要有五种模式&#xff0c;每种模式的行为和特点不同&#xff0c;以下是 static、relative、absolute、fixed 和 sticky 五种定位方式的对比总结&#xff1a; 1. static&#xff08;默认定位&#xff09; 特性…

“中秋快乐”文字横幅的MATLAB代码生成

中秋快乐呀朋友们&#xff01;&#xff01;&#xff01; 给大家带来一个好玩的代码&#xff0c;能够生成“中秋快乐”的横幅文字&#xff0c;比较简单&#xff0c;当然你也可以根据自己的需求去更改文字和背景&#xff0c;废话不多说&#xff0c;直接展示。 文字会一直闪烁&…

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

基于Springboot+vue的音乐网站

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c;包括可行性分析…

如何在Mac上安装多个Python环境

如何在Mac上安装多个Python环境 简介 在你的Mac上使用多个Python环境可以对项目管理很有帮助,特别是在同时处理不同Python版本或不同的包需求时。在这篇文章中,我们将向你展示如何在Mac上轻松地安装和管理多个Python环境。 一. 安装Conda Conda是一个包管理和环境管理系统…

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

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

代码随想录训练营第36天|二维背包

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sumaccumulate(stones.begin(),stones.end(),0);int targetsum/2;vector<int> dp(target1,0);for(auto& stone: stones){for(int itarget; i>s…

Ansible——Playbook基本功能

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;1. 基本结构2. 数据类型3. 列表4. 字典&#xff08;映射&#xff09;5. 注释…

免费表格图片识别成表格小工具

自动提取图片中的文字&#xff0c;并按照表格的格式整理好 需要的自取吧&#xff0c;下载地址&#xff1a;https://pan.quark.cn/s/f4b1ac62b808

问题:博途与kepserver通讯,kepserver读取变量数为啥对不上呢

回答&#xff1a; 1500中该变量为浮点数&#xff0c;在kepserver选择成DWORD当DINT显示了&#xff0c;将数据类型设成与1500一致。 #PLC##西门子工业支持中心##西门子##博途#工控人加入PLC工业自动化精英社群

C#图像爬虫实战:从Walmart网站下载图片

无论是电子商务网站、社交媒体平台还是新闻门户&#xff0c;图像都扮演着至关重要的角色。对于开发者来说&#xff0c;能够自动化地从这些网站下载图片是一项非常有用的技能。本文将介绍如何使用C#语言和CsQuery库来创建一个图像爬虫&#xff0c;专门用于从Walmart网站下载图片…

牛客周赛 Round 59(思维、构造、数论)

文章目录 牛客周赛 Round 59(思维、构造、数论)A. TDB. 你好&#xff0c;这里是牛客竞赛C. 逆序数&#xff08;思维&#xff09;D. 构造mex&#xff08;构造&#xff09;E. 小红的X型矩阵F. 小红的数组回文值&#xff08;数论、范德蒙恒等式&#xff09; 牛客周赛 Round 59(思维…

数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog System Verilog(部分)

注&#xff1a; 资料都是基于网上一些博客分享和自己学习整理而成的 Verilog 1. 数据类型 Verilog一共有19种数据类型 基础四种数据类型&#xff1a;reg型&#xff0c;wire型&#xff0c;integer型&#xff0c;parameter型 reg型   reg类型是寄存器数据类型的关键字。寄存…

新手学习Python第十一天,准备今天全部学完系列

——早上07&#xff1a;30到达实验室&#xff0c;开始学习&#xff0c;中秋小长假已过&#xff0c;心已收—— 一、__new__与__init__创建对象的过程 class Person(object):def __new__(cls,*args,**kwargs): *表示位置参数&#xff0c;**表示关键字参数print(__new__被调用…

快来尝尝,超赞的食家巷一窝丝

一窝丝&#xff0c;这个名字听起来就充满了诗意和神秘。当你第一次见到它时&#xff0c;定会被它那精致的外形所吸引。纤细如丝&#xff0c;盘绕在一起&#xff0c;宛如一个精美的艺术品。那丝丝缕缕&#xff0c;散发着淡淡的麦香味&#xff0c;仿佛在诉说着古老的故事。 制作食…

Imagen论文简要解析

Imagen论文简要解析 文章 Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 具有深度语言理解能力的逼真文本到图像扩散模型 https://arxiv.org/pdf/2205.11487 摘要 文章介绍了一种名为Imagen的文本到图像扩散模型&#xff0c;该模型在理…

9.12日常记录

1.extern关键字 1&#xff09;诞生动机:在一个C语言项目中&#xff0c;需要再多个文件中使用同一全局变量或是函数&#xff0c;那么就需要在这些文件中再声明一遍 2&#xff09;用于声明在其他地方定义的一个变量或是函数&#xff0c;在当前位置只是声明&#xff0c;告诉编译器…

【鸿蒙 HarmonyOS NEXT】popup弹窗

一、背景 给组件绑定popup弹窗&#xff0c;并设置弹窗内容&#xff0c;交互逻辑和显示状态。 常见场景&#xff1a;点击按钮弹出popup弹窗&#xff0c;并对弹窗的内容进行交互逻辑处理&#xff0c;如&#xff1a;弹窗内点击跳转到其他页面 二、给组件绑定Popup弹窗 PopupOp…