前言
在做web自动化的时候,登录验证码是一个大问题。在测试过程中,我们可以通过找研发进行去除,但是如果真的无法去除的时候,那应该怎么操作呢?
安静今天通过几个实例来给大家介绍下,web自动化中怎么解决验证码的问题。
通过cookies值登录
我们都知道cookies是保持登录的一种状态,那是否可以通过cookies进行登录呢?
selenium中也有获取cookies信息操作,通过将cookies保存在text中,在我们执行登录操作时,进行将cookies添加进去,这个时候就能通过cookies完成登录,从而跳过验证码内容。
思路是清晰了,先进行通过selenium进行获取cookies值信息,这里安静使用的方法是,通过chrome配置信息,selenium可以在已经打开的浏览器中进行操作,获取cookies信息。
或者在常规打开浏览器页面中强制等待30秒,手动输入验证码和验证码信息,然后在获取cookies信息。
通过打开cmd打开新的浏览器窗口(这里一定要将chrom的安装路径配置到环境变量中)。
输入命令:chrome --remote-debugging-port=8210 --user-data-dir="F:\chrome_config" # chrome:表示启动chrome浏览器 # remote-debugging-port:表示执行浏览器端口 # 8210为个人设置的端口 # --user-data-dir="F:\chrome_config":表示新建一个浏览器配置信息。
在终端打开的浏览器中进行登录,登录过后,在通过selenium进行获取登录cookies值。
from selenium import webdriver from selenium.webdriver.chrome.options import Options import json options = Options() # 启动的浏览器地址 options.debugger_address ='127.0.0.1:8210' # 将浏览器配置信息进行添加 driver = webdriver.Chrome( chrome_options=options) print('目前浏览器标题:'+driver.title) x = json.dumps(driver.get_cookies()) with open('cookies.txt','w') as f: # 将cookies保存为json格式,保存下来,方便下次使用。 f.write(json.dumps(driver.get_cookies()))
这里时候我们已经将登录的cookies获取下来了,再次通过selenium进行访问登录页面时候,通读取txt文件信息,将cookies添加进去就可以完成登录了。
from selenium import webdriver import json driver = webdriver.Chrome() driver.get('http://127.0.0.1/pro/user-login-L3Byby8=.html') with open('cookies.txt','r') as f: # 使用json读取cookies,进行添加cookies cookies_list = json.load(f) for cookie in cookies_list: driver.add_cookie(cookie) # 刷新页面 driver.refresh()
通过执行发现,我们已经完成了登录操作,从而跳过了验证码。
通OCR识别验证码
这里安静简单的介绍下通过OCR进行识别输入类型的验证码,从而完成登录操作。
在平台中找到关于OCR识别的开源接口,然后通过selenium进行获取并保存图片信息,在通过OCR的开源接口信息进行识别图片内容,最后将识别的结果输入到验证码输入框中。
import requests from selenium import webdriver import base64 import time driver = webdriver.Chrome() # 打开登录页面 driver.get('http://v3pro.houjiemeishi.com/PC/pages/login/login.html') # 获取验证码图片地址 img_url = driver.find_element_by_class_name('codeImg').get_attribute('src') # 通过请求图片地址获取图片的base64编码 img_r = requests.get(url=img_url) base64_data = base64.b64encode(img_r.content).decode() bodys = { "v_pic": base64_data, "pri_id": 'ne', "number": 4 } # 这个参数可以通过尖叫数据进行自行申请 headers = { 'appcode': "xxxxxxx", "appKey": "xxxxxx", "appSecret": "xxxxxxx" } # 请求验证码接口信息,返回验证码数字 url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html' r = requests.post(url, headers=headers, data=bodys) tt = r.json()['v_code'] time.sleep(1) # 验证码输入框输入验证码信息 driver.find_element_by_class_name('ipt2').send_keys(tt)
通过执行发现,我们已经在验证码输入框中输入了正确的验证码信息。
总结
其实跳过验证码的方法还有很多种,安静只是介绍了最简单最常用的两种方法进行跳过,当然最最最简单的肯定是让研发自动化测试阶段进行去除,或者用一个万能验证码进行输入。
作者:测试安静