selenium 4.x 之验证码处理(python)

 验证码处理

一般情况公司如果涉及web自动化测试需要对验证码进行处理的方式一般有一下几种:

  • 关闭验证码功能(开发处理)
  • 设置万能验证码(开发处理)
  • 使用智能识别库进行验证
  • 通过第三方打码平台识别验证码

1. 跳过验证功能

需要开发配合,关闭验证码功能或者设置万能验证码

 2. 使用智能识别库进行验证(不推荐)

使用ddddocr库

基于深度学习的工具

主要用于识别图片中的文字以及数字内容

主要 特点:易用,正确率以及高效的优势

from ddddocr import DdddOcr
# 截取验证码图片
img = driver.find_element(By.XPATH, '//*[@id="verify"]').screenshot_as_png
# 使用识别库
verify = DdddOcr(show_ad=False).classification(img)

注意点:识别成功率会根据图片的复杂程度决定,所以使用程度并不高,但是可以进行对应的

优化,比如识别之后的验证码准确的判断

3. 通过第三方打码平台识别验证码

#截取验证码图片driver.find_element(By.ID, 'slideBg').screenshot("vertify.png")

通过第三方接口发送请求识别验证码内容

超级鹰官方平台:https://www.chaojiying.com/price.html

识别验证码的接口地址:https://upload.chaojiying.net/Upload/Processing.php

登录平台,注册并生成软件ID

3.1 封装识别验证码函数

新建一个utils模块定义一个函数来识别验证

需要识别验证码,只需要调用对应的函数即可

函数中需要处理的逻辑就是识别返回结果

utils.py

#!/usr/local/bin/python3
# @IDE: PyCharm
# @.py: get_code
#-*- coding : utf-8
# @Author:may
# @Time: 2024/4/27
import requests# 打码平台识别验证码
def img_code():url = 'https://upload.chaojiying.net/Upload/Processing.php'# 传递实参数据data = {# 用户名"user": "young",# 密码"pass": "3db3a2****80c675da4",# 用户id"sofid": "95**27",# 验证码类型编号"codetype": 1004}# 提取验证码图片files = {"userfile": open("verify.png", "rb")}# 发送接口请求识别验证码resp = requests.post(url, data=data, files=files)# 查看响应信息# print(resp.json())res = resp.json()print(res)if res["err_no"] == 0:code = res["pic_str"]print(f"验证码识别成功:{code}")return codeelse:print("验证码识别失败")return False

"codetype": 1004 是1~4 位英文数字

使用

from common.utils import img_code
# 获取验证码图片,保存至本地
driver.find_element(By.ID, '***').screenshot("verify.png")
# 调用验证码图片识别
code = img_code()

调用成功结果:

3.2 滑块验证

验证码类型 9103 的返回结果如下:

验证码 9101 的返回结果:

以豆瓣登录为例:

切换焦点并下载验证图片,将焦点切换至滑块验证区域,并下载加载好的滑块验证背景图片。

点击登录按钮后,就会出现滑块验证区域,这是一个新增的frame区域,此时我们需要将切换的焦点从主页面转换到这个frame区域上

driver.switch_to.frame('tcaptcha_iframe_dy')

 获取验证码图片

# 获取验证码图片,保存至本地
driver.find_element(By.ID, 'slideBg').screenshot("verify.png")

 左边匹配的滑块的位置

有很多方法,但是好像都不是很适用这个,不知道是不是 mac上画布不大一样。。。要么就是很麻烦。。。 

selenium 与 超级鹰结合完成自动登录验证-CSDN博客

超级鹰,字符,点触,滑块验证码识别-CSDN博客

关于滑块验证码的问题_滑块验证码上机报告-CSDN博客

【Python从入门到进阶】39、使用Selenium自动验证滑块登录_selenium滑块验证码实现-CSDN博客

 *4. 通过cookie保持登录

需要保持登录状态方式:

通过cookie信息的唯一标识符id进行验证

让标识符id一直保持登录的状态,那么再次访问页面的时候就是已登录的状态

通过cookie的机制原理先获取已登录的id然后再未登录的页面中进行使用即可

需要退出登录状态方式:

关闭整个浏览器

自动清除cookie信息

删除已登录的表示id

刷新页面,自动退出登录的状态

注意点:对页面的cookie值进行修改完成之后,一定要刷新页面才生效,需要清楚缓存

使用selenium提供的方法,get_cookies提取当前页面中所有的cookie信息

4.1 封装自动化获取cookie

第一次登录完成之后,把页面的已登录的cookie信息进行保存(唯一标识符的id)

在第二次及所有需要登录的页面中直接使用已登录的cookie信息,直接绕过登录

定义2个函数来获取cookie和使用cookie

utils.py

import jsondef save_cookies(drier):# 将已登录页面中的cookie进行保存cookies = drier.get_cookies()with open("cookies.json", "w") as f:f.write(json.dumps(cookies))
def load_cookies(driver):try:with open("cookies.json") as f:cookies = json.loads(f.read())# 遍历字典获取cookie信息进行添加for cookie in cookies:driver.add_cookie(cookie)else:# 刷新页面,清除缓存driver.refresh()except:print("目前没有可以使用的已登录cookie信息")

4.2 使用cookie绕过登录

使用cookie信息进行绕过登录,保持登录状态:

import time
from webdriver_helper import get_webdriver
# import requests as requests
# from selenium.webdriver.common.by import By
from common.utils import img_code, load_cookies, save_cookiesdriver = get_webdriver()  # 启动浏览器
driver.get("https://accounts.douban.com/passport/login")  # 控制浏览器driver.maximize_window()
time.sleep(3)
# 使用cookie信息
load_cookies(driver)
# 完成登录用例脚本,解决验证码的处理
# driver.find_element(By.XPATH, '//*[@id="verify"]').screenshot("verify.png")
# code = img_code()
# driver.find_element(By.XPATH, '/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[2]/td[2]/input').send_keys("admin")
# driver.find_element(By.XPATH, '/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[3]/td[2]/input').send_keys("msjy123")
# driver.find_element(By.XPATH, '/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/input').send_keys(code)
# driver.find_element(By.XPATH, '//*[@id="login_btn"]').click()
# 保存cookie信息
# save_cookies(driver)
time.sleep(5)
driver.quit()

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

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

相关文章

【目标检测】DEtection TRansformer (DETR)

一、前言 论文: End-to-End Object Detection with Transformers 作者: Facebook AI 代码: DEtection TRansformer (DETR) 特点: 无proposal(R-CNN系列)、无anchor(YOLO系列)、无NM…

C++入门基础(三)

这里写目录标题 引用引用概念例子1例子2例子3例子4 常引用引用的应用做参数做返回值野引用扩展 传值、传引用效率比较引用和指针的区别C对比C语言实现顺序表 内联函数概念特性 🐒🐒🐒 个人主页 🥸🥸🥸 C语…

分布式八股文

什么是分布式系统? 集中式系统,可以理解为将一整个系统的所有功能,包括数据库各种都部署在一起,统一向外提供服务。分布式就是将集中式系统拆分成多个系统,每一个系统单独对外提供服务,整一个提供一整套服务。意味着能够采用更多的服务器,CPU、内存、存储资源增加,能够…

[方法] Unity 解决类《原神》角色移动方向问题

第三人称视角类的游戏有很多,比如《原神》、《崩坏:星穹铁道》、《剑星》、《绝地求生》等。这些游戏中,角色的移动方向取决于玩家的输入和相机的方向,例如玩家在键盘上按下D键,则角色会相对于相机方向向右移动,本篇文…

dnf游戏攻略:保姆级游戏攻略!

欢迎来到DNF,一个扣人心弦的2D横版格斗游戏世界!无论你是新手还是老玩家,这篇攻略都将为你提供宝贵的游戏技巧和策略,助你在游戏中大展身手,成为一名强大的冒险者。 一、角色选择 在DNF中,角色的选择至关重…

K8S join 证书过期 节点报错:certificate has expired or is not yet valid

问题场景: 我是因为虚拟机,挂起了几天,再打开join节点的时候报错: 证书过期报错 ...其他输出 I0427 15:33:56.626776 93338 token.go:215] [discovery] Failed to request cluster-info, will try again: Get "https://…

量子城域网建设案例分析(一):广西量子通信技术试验平台

对量子城域网的讨论已经有一段时间了,经过近期系列文章的讨论,我们对城域网的整体情况、关键技术以及核心设备等都有了一些基本的认识,今天我计划对广西量子通信技术试验平台构建与应用研究服务采购项目进行讨论,通过对实际案例的…

IoTDB 入门教程⑤——数据模型和基础概念

文章目录 一、前文二、数据模型2.1 关系型数据库MySQL。2.2 时序数据库TDengine2.3 时序数据库InfluxDB2.4 时序数据库IoTDB(本专栏的正主) 三、基础概念3.1 数据库(Database)3.2 设备模板(元数据模板)3.3 …

asp爬虫代码简单示例

要创建一个ASP爬虫&#xff0c;你可以使用ASP内置的对象XMLHTTP或ServerXMLHTTP来发送HTTP请求&#xff0c;获取网页内容&#xff0c;然后使用ASP的内置对象HTMLFILE来解析HTML内容。以下是一个简单的ASP爬虫示例代码&#xff1a; <%初始化变量 Dim http Dim url Dim html …

C语言——小知识和小细节17

一、未能给指针成功赋值 #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char* p) {p (char*)malloc(20 * sizeof(char)); }void Test() {char* str NULL;GetMemory(str);strcpy(str, "Hello World!");printf(&quo…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意&#xff1a;IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中&#xff0c;rtc在网上还是挺少人应用的&#xff0c;找了很久没什么资料&#xff0c;现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳&#xff1a;RTC可以记录事件发生的精确时间&…

Rust move

一、move有什么用 当你在闭包前加上 move 关键字时&#xff0c;闭包会强制获取其所需变量的所有权。这意味着即使在闭包外部变量的所有权被转移给闭包&#xff0c;闭包之外的代码也不能再使用这些变量 看两段代码 fn main() {let x String::from("value");let cl…

DRF解析器源码分析

DRF解析器源码分析 1 解析器 解析请求者发来的数据&#xff08;JSON&#xff09; 使用 request.data 获取请求体中的数据。 这个 reqeust.data 的数据怎么来的呢&#xff1f;其实在drf内部是由解析器&#xff0c;根据请求者传入的数据格式 请求头来进行处理。 drf默认的解…

计算机408备考-数据结构重要知识点-数据结构的定义

请关注一下B站账号&#xff1a;谭同学很nice&#xff01;后期更新发布在这个账号上。。【计算机408备考-数据结构重要知识点-数据结构的定义-哔哩哔哩】https://b23.tv/x7shjNf 数据是信息的载体。数据元素是数据的基本单位。一个数据元素可由若干数据项组成&#xff0c;数据项…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程&#xff0c;本文前面将在在线环境中安装用到的各种所需验证软件&#xff0c;而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…

使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

文章目录 概述安装Android Studio编译源码使用Android Studio打开源码制作ipr文件直接编译成功后自动打开Android Studio 修改SystemUI验证开发环境 概述 我们都知道Android的系统源码量非常之大&#xff0c;大致有frameworka层源码&#xff0c;硬件层(HAL)源码&#xff0c;内…

【华为OD机试】数组连续和(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 输入描述 第一行两个整数N x(0 < N <= 100000, 0 <= x <…

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…