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 code
    else:
        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博客 

 *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 json

def 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_cookies

driver = 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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频转换过程中的几个基本注意事项

1.迟滞 海康的摄像头迟滞大概会到1秒的量级,一般如果你自己搭个框架做转发,迟滞有时会达到20秒,这是为什么呢?请看例程: class VideoCamera(object):def __init__(self):# 打开系统默认摄像头self.cap cv2.VideoCaptu…

看看大家都在做哪些有趣的项目

最近发现两个比较有趣的项目 1.中国独立开发者项目列表 该项目旨在聚合中国独立开发者的项目,分享开发者们正在进行的工作,项目列表包括网站或 App,并且正在持续更新中 项目分为程序员版和主版面: 程序员版:用户是程…

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下: Dockerhttps://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本,先拉取镜像。命令如下: docker pull redis:6.2.14 查看刚刚下载的镜像&am…

M2 Mac mini跑Llama3

前言 在4-19左右,Meta 宣布正式推出下一代开源大语言模型 Llama 3;共包括 80 亿和 700 亿参数两种版本,号称 “是 Llama 2 的重大飞跃”,并为这些规模的 LLM 确立了新的标准。实际上笔者早就体验过,只不过自己电脑没什…

nuxt3使用记录五:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为,今天我突然很好奇,我发现之前构建的自动产生的200.html和404.html足足290k,怎么这么大呢?不是很占用我带宽? 一个啥东西都没有的静态页面,凭啥这么大!所以我就想着手动把他…

matlab新手快速上手6(引力搜索算法)

本文根据一个较为简单的matlab引力搜索算法框架详细分析蚁群算法的实现过程,对matlab新手友好,源码在文末给出。 引力搜索算法简介: 引力搜索算法是一种启发式优化算法,最初于2009年由伊朗的Esmat Rashedi、Hossein Nezamabadi-p…

MyBatis(注解方式操作)

文章目录 1.注解方式操作文件目录1.快速入门(完整步骤)1.pom.xml(完整)2.resources/jdbc.properties外部配置文件(根据实际情况修改参数)3.在resources/mybatis-config.xml(完整)中配…

Linux基本指令(3)

目录 时间相关的指令: 1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加好后接数个标记,其中常用的标记列表如下: 2.在设定时间方面: 3.时间戳: Cal指令: find指令&a…

韩国云主机安装AMP环境要求科普

AMP环境,即Apache、MySQL和PHP的组合,是许多网站开发者和运维人员常用的环境配置。在韩国云主机上安装AMP环境,需要满足一定的要求以确保顺利运行和高效性能。下面我们将对韩国云主机安装AMP环境的要求进行科普。 首先,韩国云主机…

深入探索MySQL锁机制:揭秘死锁原因与RC隔离级别下的事务处理

MySQL锁的类型及死锁概述 在数据库系统中,为了保证事务可以正确地访问数据,防止数据不一致,通常会使用锁机制。MySQL作为广泛使用的数据库之一,其InnoDB存储引擎提供了多种锁类型,主要包括行锁(Record Loc…

每日一题(力扣55):跳跃游戏--贪心

刚开始像这道题&#xff0c;想的是这么从当前可以走的那几步中选择一步&#xff0c;所以一坨屎一样的代码 class Solution { public:bool canJump(vector<int>& nums) {int nnums.size();int step0;int u0;int u_max0;int step_size0;int max_size0;int loci0;while…

机器学习-11-卷积神经网络-基于paddle实现神经网络

文章目录 总结参考本门课程的目标机器学习定义第一步&#xff1a;数据准备第二步&#xff1a;定义网络第三步&#xff1a;训练网络第四步&#xff1a;测试训练好的网络 总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍基于paddle实现神经网络。 参考 MNIST 训练_副…

FreeRTOS:3.信号量

FreeRTOS信号量 参考链接&#xff1a;FreeRTOS-信号量详解_freertos信号量-CSDN博客 目录 FreeRTOS信号量一、信号量是什么二、 FreeRTOS信号量1、二值信号量1、获取信号量2、释放信号量 2、计数信号量3、互斥信号量1、优先级反转2、优先级继承3、源码解析1、互斥量创建2、获取…

FFmpeg常用结构体、关键函数、ffplay.c分析

一、常用结构体&#xff1a; 1、AVFormatContext结构体&#xff1a; AVFormatContext是一个贯穿全局的数据结构&#xff0c;很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context&#xff0c;此结构包含了一个视频流的格式内容。其中存有AVIputFor…

电脑使用笔记

1.电脑亮度调节 亮度&#xff1a;50 对比度&#xff1a;45 暗部平衡&#xff1a;40

毕业设计注意事项(嘉庚学院2024届更新中)

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料。 2.毕设以及实习 2.1 毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 2.2 实习材料提交 2.2.1 校外实习 实习前&#xff1a;根据学院要求&#xff0c;填写好实习承诺书&#xff0c;实习单位…

【数据结构初阶】时间复杂度和空间复杂度详解

今天我们来详细讲讲时间复杂度和空间复杂度&#xff0c;途中如果有不懂的地方可翻阅我之前文章。 个人主页&#xff1a;小八哥向前冲~-CSDN博客 数据结构专栏&#xff1a;数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 c语言专栏&#xff1a;c语言_小八哥向前冲~的博客-CS…

网络服务SSH-远程访问及控制

一.SSH远程管理 1.SSH介绍 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;最早是由芬兰的一家公司开发出来&#xff0c;并且在IETF &#xff08;Internet Engineering Task Force&#xff09;的网络草案基础上制定而成的标准协议。主要用来实现字符…

合规基线:让安全大检查更顺利

前言 说起安全检查&#xff0c;安全从业人员可能都非常熟悉“安全标准”概念。所有企事业单位网络安全建设都需要满足来自于国家或监管单位的安全标准&#xff0c;如等保2.0、CIS安全标准等。安全标准&#xff0c;还有一个叫法就是“安全基线”。字典上对“基线”的解释是&…

【PostgreSQL】pg触发器介绍

注: 本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 触发器是在对指定表执行指定更改操作&#xff08;SQL INSERT、UPDATE、DELETE 或 TRUNCATE 语句&#xff09;时自动运行的一组操作…