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