我们使用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()
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)
另外,还可以使用云打码的方式来处理验证码
留存博客,以后验证码的问题轻松解决~