51Testing软件测试论坛

标题: web自动化中常用的跳过验证码操作 [打印本页]

作者: lsekfe    时间: 2021-5-24 10:09
标题: web自动化中常用的跳过验证码操作
前言
  在做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)



  通过执行发现,我们已经在验证码输入框中输入了正确的验证码信息。


  总结
  其实跳过验证码的方法还有很多种,安静只是介绍了最简单最常用的两种方法进行跳过,当然最最最简单的肯定是让研发自动化测试阶段进行去除,或者用一个万能验证码进行输入。

作者: 千里    时间: 2021-5-24 10:25
直接让开发屏蔽验证码是最简单的
作者: 郭小贱    时间: 2021-5-24 11:39
内部测试可以使用万能验证码或者屏蔽验证码,但是拿外部正式网站搞时还是无法避开验证码环节。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2