Selenium中遇到验证码问题的处理

我们使用selenium自动化测试工具中难免会遇到验证码,那么我们应该如何处理?

使用抓包工具获取cookie,然后在python+selenium中进行免登录,也算是跳过验证码

给大家弄一个简单的抓取百度登录cookie

1、安装charles,打开charles,并安装相关的https证书,并且将我们想要获取cookie的网址进行拦截(只显示该网址)

在这里插入图片描述

2、打开百度,输入账号密码,记得勾选【下次自动登录】

在这里插入图片描述
3、此时的charles已经记录了cookie信息,让我们来找一找【BAIDUID】与【BDUSS】

在这里插入图片描述
我们将【BAIDUID】与【BDUSS】值复制拿出来,运用到代码中

4、打开pycharm,将我们拿到的cookie运用起来

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(15)
driver.get('http://www.baidu.com/')

driver.maximize_window()

driver.add_cookie({"name":"BAIDUID","value":"你抓取到的BAIDUID值"})
driver.add_cookie({"name":"BDUSS","value":"你抓取到的BDUSS值"})
time.sleep(2)
driver.refresh()

5、运行查看结果

在这里插入图片描述

使用模拟用户登录的方式来跳过验证码

就是将输入用户名和密码的地方换成input的方式,并加强制时间等待输入信息
这里也是拿百度示例

#跳过验证码方式二:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
driver.implicitly_wait(20)
driver.find_element_by_link_text('登录').click()
driver.find_element_by_class_name('tang-pass-footerBarULogin').click()
inputs = driver.find_elements_by_tag_name('input')
while True:
    for i in inputs:
        if i.get_attribute('placeholder') =="手机/邮箱/用户名":
            a = input("请输入手机号")
            i.send_keys(a)
        elif i.get_attribute('placeholder') =='密码':
            a = input("请输入密码")
            i.send_keys(a)
            break
    break
driver.find_element_by_id('TANGRAM__PSP_10__submit').click()

使用pytesseract(图片识别库)+PIL(图片处理库)的方式处理验证码

PIL是Python平台事实上的图像处理标准库,支持多种格式,并提供强大的图形与图像处理功能。目前PIL的官方最新版本为1.1.7,支持的版本为python 2.5, 2.6, 2.7,并不支持python3,因此我们用pillow代替,进入DOS命令行窗口,敲入以下代码:
pip install pillow

注意: 如果你开着fiddler或者其他抓包工具,关闭后在装库,切记。

接下来通过处理后,进行验证码的读取,读取使用pytesseract,打开cmd,输入:
pip install pytesseract

完事安装tesseract-ocr软件:
安装地址及配置该环境教程

配置好环境变量以后,我们修改一下pysseract.py的配置:

在这里插入图片描述

把tesseract_cmd 后面值修改为安装目录下的tesseract.exe执行文件绝对路径

使用方法

from selenium import  webdriver
import time
from PIL import Image
import pytesseract

driver = webdriver.Chrome()
driver.get('http://www.qunar.com/')

loginbtn = driver.find_element_by_id('__headerInfo_login__')
ActionChains(driver).click(loginbtn).perform()
time.sleep(1)
#1、浏览器全屏(放大):
driver.maximize_window()
time.sleep(2)


mybtn = driver.find_element_by_class_name('port-toggler')
ActionChains(driver).click(mybtn).perform()
time.sleep(1)
path = r'D:\PycharmProjects\pybai\2020420.png'
#  截图:
driver.get_screenshot_as_file(path)

#2、定位验证码的位置
vcodeImg = driver.find_element_by_id('vcodeImg')

#3、取验证码的矩形区域
point = vcodeImg.location  #字典形式  水平位置和垂直位置,x和y值
size = vcodeImg.size   #字典形式,宽和高
x = int(point['x'])
y = int(point['y'])
width = int(x+size['width'])
height = int(y+size['height'])

#处理图片Image:
myimg = Image.open(path)
#参数是元祖,如果截图不清晰,1.5为分辨率,从1.0开始不会超过2.0
#littleimg = myimg.crop((1.5*x,1.5*y,1.5*width,1.5*height))  #截图
littleimg = myimg.crop((x,y,width,height))  #截图
littleimg.save('little.png')    #截图名字



#5、图片识别:pytesserct

time.sleep(5)
result = pytesseract.image_to_string(Image.open('little.png'))
time.sleep(5)
print('图片结果是:%s'%result)

另外,还可以使用云打码的方式来处理验证码

留存博客,以后验证码的问题轻松解决~

原创文章 34 获赞 216 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_46457203/article/details/105857918