python web自动化(验证码处理)

1.解决验证码问题的常⻅⼏种⽅式

1) Debug模式启动浏览器(浏览器复⽤):

原理:浏览器是有缓存记录的,只需要 沿⽤已经保存有登录记录的浏览器 进⾏后续的操作就⾏

2)识别法:

原理:对验证码的图⽚进⾏字符识别,其原理就是通过 识别算法解析图⽚ ,其解析的精准度取决于图⽚的复杂程度注: 精准度不⾼,如果图⽚越复杂,失败率越

3)接⼝法:

原理:开发⼈员提供⼀个测试接⼝,通过这个 接⼝获取 到图⽚验证码⽐如:在服务端提供⼀个可被客户端使⽤的接⼝,只要客户端传递过来⾃⼰的SessionID,该接⼝就返回此时正确的Session

注: 新增了接⼝,存在安全的问题,⼀般只在测试环境使⽤

4)移除法:

跟开发协商,在测试的时候,直接 关闭验证码功能

5)暗号法:

跟开发协商,提供 万能验证码 来进⾏访问(只建议在测试环境使⽤,涉及到安全问题)

6) Cookie跳过验证码:

原理:⼿动登录,然后获取登录成功的cookie,在⽤代码做后续操作的时候,把 cookie附带 进去,已达到鉴权的⽬的

注: cookie是有过期时间的,可以跟开发协商延⻓时间等

2.Debug模式启动浏览器(浏览器复⽤)

        1.在桌⾯ 右键点击 google浏览器,然后选择 属性

        2.复制 ⽬标 ⾥⾯的路径, 不要包含chrome.exe ,示例: C:\Program Files (x86)\Google\Chrome\Application\

        3.把复制的 路径配置到系统环境变量 Path中

        4.在D盘下⾯,新建⼀个txt⽂本,输⼊内容: chrome.exe --remote-debugging-port=9222 ,然后保存后并修改⽂件名字(包括后缀名)为: chrome.bat (出现提示信息, 同意即可 )

        5.如果配置成功,双击chrome.bat⽂件,会打开⼀个新的浏览器窗⼝

                具体的操作步骤:
                1)先运⾏代码,确保不会出 Chrome正受到⾃动测试软件的控制。 提示:
                

                2)⼿动进⾏登录的操作,然后上述代码注释,在运⾏后续的⽤例代码
                

# driver.get("https://cart.taobao.com/cart.htm")
#
# driver.find_element_by_id('fm-login-id').send_keys('自己的淘宝账号')
# driver.find_element_by_id('fm-login-password').send_keys('自己的淘宝密码')
# driver.find_element_by_xpath("//div[@class='fm-btn']").click()

        3)浏览器复⽤模式下:如果需要切换窗⼝,需要特殊处理:

                1.在⻚⾯上,点击回到第⼀个窗⼝

                2.运⾏窗⼝切换代码

3.Cookie跳过验证码

                ⼿动打开浏览器进⾏登录操作,然后登录成功后打开F12(开发者⼯具)获取cookie值
                操作路径: F12打开开发者⼯具--->Application--->cookies

                注: 登录时有勾选下次⾃动登录的请勾选,浏览器提示是否保存⽤户密码时请选择确定,这样获取的cookie成功登陆的机率⽐较⾼
                

""""""
import time

from selenium import webdriver

driver = webdriver.Chrome()

driver.get("http://novel.hctestedu.com/")
time.sleep(3)

# 通过已经获取到登录成功的cookie完成后续的操作(不是固定的,每一个项目都是不一样,可以跟开发咨询,实在不行的话:一个个的去试)
driver.add_cookie({"name": "Authorization",
                   "value": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2OTc2MzQyNzIsInN1YiI6IntcImlkXCI6MTcwNTQ3Njk3MDgzMzAyMjk3NixcInVzZXJuYW1lXCI6XCIxNzc5ODk4OTg5OFwiLFwibmlja05hbWVcIjpcIjE3Nzk4OTg5ODk4XCJ9IiwiY3JlYXRlZCI6MTY5NzAyOTQ3Mjg0NX0.ZBv7-MntLdEqB48a9ErhkKt9-3RgD-XtA5oNqUQ8qdScnxVnjq6BFCcqIrKhSD94DccYPzebCu650Ql92OoqEw"})

# 刷新当前页面
driver.refresh()
time.sleep(5)

"""
cookie有时间限制的,这个时间是开发设置的,可以和开发协商(加长)
"""

4.JS处理⽅案

        滑动解锁问题使⽤ActionChains功能,⽤⿏标按住滑块并移动
                

ActionChains(driver)\
.click_and_hold(slider_button)\
.move_by_offset(delta_x,0)\
.perform()

         我们有一个处理验证码滑动的网页

        

""""""
import time

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get(r"E:\Python\pythonProjects\Webtest0524\day6\04 JS处理方案\验证码样例.html")

# 定位到滑动按钮
button=driver.find_element(By.CLASS_NAME,"captcha-slider")


# 定位滑动条
button_tiao=driver.find_element(By.CLASS_NAME,"captcha-container")

# 获取滑动条的宽度
wide=button_tiao.size["width"]


# 模拟拖动滑动条
# ActionChains(driver).click_and_hold(button).move_by_offset(wide,0).perform()


# 加一些步骤,使滑动的效果慢一些
action = ActionChains(driver)
action.click_and_hold(button).perform()
while True:
    try:
        action.move_by_offset(5, 0).perform()
    except:
        print("超出移动的范围之外了!")
        break
    time.sleep(0.1)

# 释放所有的actions,不然鼠标一直都是按住的状态
ActionBuilder(driver).clear_actions()

   5.OpenCV 图像预处理:灰度化和⼆值化

                1)图像⼆值化基本原理:

        对灰度图像进⾏处理,设定阈值,在阈值中的像素值将变为1(⽩⾊部分),阈值为的将变为           0(⿊⾊部分)

                2)图像⼆值化处理步骤

                        1.先对彩⾊图像进⾏去噪:

             

//img为原图
cv.pyrMeanShiftFiltering(image, 10, 100)

                我们的原图是这个                

                去完噪之后就变成如下: 可以明显的发现背景变得模糊


                        2.先对彩⾊图像进⾏灰度化

                        

# 对图片进行灰度处理
grayscale_picture = cv.cvtColor(denoised_picture, cv.COLOR_BGR2GRAY)
cv.imwrite("grayscale_picture.png", grayscale_picture)

//img为原图, imgGray为灰度图
cvtColor(img, imgGray);

                        

                        3.对灰度图进⾏⼆值化

                        

# 对图像进行二值化处理(管道符 |)
threshold_value, binary_picture = cv.threshold(grayscale_picture, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
print("获取的阙值: ", threshold_value)
cv.imwrite("binary_picture.png", binary_picture)


//imgGray为灰度图, result为⼆值图像
//100~255为阈值,可以根据情况设定
//在阈值中的像素点将变为0(⽩⾊部分),阈值之外的像素将变为1(⿊⾊部分)。
threshold(imgGray, result, 100, 255, CV_THRESH_BINARY)

                
                        

6.OCR图像识别

                原理:(Optical Character Recognition,光学字符识别)技术,将图⽚、照⽚上的⽂字                    内容,直接转换为⽂本

                

# 使⽤opencv读取图像(cv.imread)之后是BGR格式的,使⽤PIL读取图像(Image.open))之后是RGB格式的。
image = Image.open(file_name)
# 运⾏tesseract对图⽚进⾏OCR识别
img_str = pytesseract.image_to_string(image)

        tesseract库安装与配置环境变量(识别字幕)_tesseract ocr环境变量-CSDN博客

                这时图像识别配置的网址

        

               识别到了验证码

实战:

我们用这个网站进行实战训练

        

""""""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import cv2 as cv
import pytesseract
from PIL import Image

driver = webdriver.Chrome()

driver.get("http://120.25.127.201:18001/user/register.html")

# 准备测试数据
username = "181665852331"
password = "123456"

# 输入注册信息
driver.find_element(By.ID,"txtUName").send_keys(username)
driver.find_element(By.ID,"txtPassword").send_keys(password)

"""
对验证码进行处理
"""

# 保存验证码的截图
driver.find_element(By.ID,"chkd").screenshot("verification_code.png")

# 原图
master_drawing = cv.imread("verification_code.png")
# print("原图: ", master_drawing)

# 对图片进行去噪处理
denoised_picture=cv.pyrMeanShiftFiltering(master_drawing,10,100)


# 对图片进行灰度处理
gry_picture=cv.cvtColor(denoised_picture,cv.COLOR_BGR2GRAY)
cv.imwrite("gray_picture.png",gry_picture)

# 对图像进行二值化处理(管道符 |)
binary_picture=cv.threshold(gry_picture,0,255,cv.THRESH_BINARY)
cv.imwrite("binary_picture.png",binary_picture)

# 使用PIL打开图像转化为图像对象,并使用pytesseract进行图像识别
captcha_picture = Image.open(binary_picture)
verification_code = pytesseract.image_to_string(captcha_picture)

# 输入验证码
driver.find_element(By.ID,"TxtChkCode").send_keys(verification_code)

# 点击登录按钮
driver.find_element(By.ID,"btnRegister").click()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值