一、抛出问题

在日常的测试工作中,遇到了这样一个登录页面,如下图:

像我们之前做过UI自动化的同学就知道,自动输入账号和密码,这个简单,但是怎么样来识别验证码呢?验证码的形式有多种,有纯数字的,纯字母的,有字母和数字的,有计算的等等;而且每次都是随机出现的,这种情况我们怎么来识别呢?如何解决这个难题?

二、分析问题

在测试环境中,遇到这种情况,分析了一下,大概有以下几种思路:

1、  让开发在测试环境中,去掉验证码;

2、  测试环境中,设置一个万能的验证码;

3、  通过cookie绕过登录;

4、  通过自动识别技术,来识别验证码;

对于以上方法,前三种都不太好方便,需要依赖上游,所以,我们尽可能的自己单枪匹马去解决。现在主要来讲第4种方法。

自动识别技术,其实就是通过第三方网站的力量来实现快速识别,花1块钱,就能用500次,有现成的东西,直接借助打码平台的自动识别技术使用就行,少喝一瓶矿泉水的钱,就能帮我们解决大问题。我们这里以某一个打码平台为示例来讲解:

百度搜索:图鉴打码平台,找到结果,并点击进入。

点击开发文档,可以看到导航条可以用多种编程语言将其写好了,这些都是可以直接拿来使用的;我们这里以python语言为例,借助使用一下。但是,需要花钱,也就充值1块钱,就可以用500次。为了,第一步就是要在这个打码平台上进行注册,登录,再充值1元即可。有以下重要信息需要用到:你的账号和密码。

接下来,我们对这段python代码来简单分析一下:

比如,你的验证码是纯数字,你就传1;你的验证码是纯英文,你就传2;如果你的验证码是数字字母混合的,那就传3;像我遇到的,是计算题验证码,我就传了11。

=================================================================

那么,我们先来写一下思路:

# 第一步:打开浏览器,访问登录页面

# 1.1启动浏览器

# 1.2 打开后台监控平台的登录页面

# 第二步:输入账号、密码

# 输入账号

# 输入密码

# 第三步:识别验证码图片中的内容

# 3.1截取网站中的验证码图片

# 3.1.1、对当前网页进行截图,并保存为图片

# 3.1.2  定位页面的图片元素,

# 3.1.3 获取图片在页面中的坐标位置(此处计数位置要考虑屏幕的缩放比例)

# 验证码左边界位置

# 验证码上边界位置

# 验证码右边界位置

# 验证码下边界位置

# 3.1.4 通过验证码的位置进行截图

# 3.1.5 保存截取下来的验证码为code.png的图片

# 3.2 调用验证码识别的方法去识别

# 第四步:输入识别之后的结果,点击登录

# 4.1 输入计算结果之后的验证码

# 4.2点击登录按钮

# 第五步:关闭浏览器

======================================================================

所以,重点就在第三步,尤其要注意一个细节,就是屏幕缩放比。

如果你忘记这里,有可能对验证码截图截不到。

接下来上代码

from selenium import webdriver
import base64
import json
import requests
from PIL import Image # 64位编码流
def base64_api(uname, pwd, img, typeid):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"] # 第一步:打开浏览器,访问登录页面
# 1.1启动浏览器
driver = webdriver.Chrome()
# 1.2 打开后台监控平台的登录页面
driver.get('') # 第二步:输入账号、密码
# 输入账号
driver.find_element_by_xpath('//input[@placeholder="账号"]').send_keys('')
# 输入密码
driver.find_element_by_xpath('//input[@placeholder="密码"]').send_keys('') # 第三步:识别验证码图片中的内容
# 3.1截取网站中的验证码图片
# 3.1.1、对当前网页进行截图,并保存为page.png的图片
driver.save_screenshot('page.png')
# 3.1.2 定位页面的图片元素,
pic_ele = driver.find_element_by_xpath('//div//img')
# 3.1.3 获取图片在页面中的坐标位置(此处计数位置要考虑屏幕的缩放比例)
rec = pic_ele.rect
# 验证码左边界位置
left = rec['x'] * 1.50
# 验证码上边界位置
top = rec['y'] * 1.50
# 验证码右边界位置
right = (rec['x'] + rec['width']) * 1.50
# 验证码下边界位置
button = (rec['y'] + rec['height']) * 1.50
location = (left, top, right, button) # 3.1.4通过验证码的位置进行截图
page = Image.open('page.png')
code_pic = page.crop(location)
# 3.1.5 保存截取下来的验证码为code.png的图片
code_pic.save('code.png') # 3.2 调用验证码识别的方法去识别
result = base64_api(uname='', pwd='', img='code.png', typeid=11)
print("识别的结果是:", result) # 第四步:输入识别之后的结果,点击登录
# 4.1 输入计算结果之后的验证码
driver.find_element_by_xpath('//input[@placeholder="验证码"]').send_keys(result) # 4.2点击登录按钮
driver.find_element_by_xpath('//button[@type="button"]').click()

对代码进行讲解和注意的细节。这个脚本是可以直接复制粘贴拿过去用的

三、总结思路

结尾要简单聊两句:首先,这个打码平台不止一个,还有其他的打码平台的也可以借助使用,也会有类似的开发文档代码,他山之石,可以攻玉,只需花1块钱就可以,任何一个打码平台都行。至于开发文档的语言,也是可以任选的,有的web自动化是python写的,有的是java写的,甚至有的是javascript写的,都行,自由选择即可。

因为,我们基本可以总结出如下思路:

1、  任选一个打码平台,注册登录并充值1元

2、  进入该平台的开发文档,选择你所用到的编程语言一类,复制粘贴代码

3、  把你刚才所充值的平台的账号、密码;传参传进去,对应的typeid也改一下

4、  检查你的电脑屏幕缩放比例,在所对应的坐标位置代码块中乘以比例

最后,在pycharm,run一下,会给你期望的惊喜那般,哇塞,贼6

好了,以上就是很简单很实用并且性价比极高的解决方法,不需要跟开发吵架,让他特意为了方便你测试,故意改代码块;也不需要跟着学习其他深度的OCR识别技术,太耗时了,还不一定学的会;我们就选择这种单枪匹马的思路,干就完事了。

亲自有效,有任何问题,可留言,笔者可通过向日葵远程连接你电脑,帮你操作好。

Web自动化---解决登录页面随机验证码问题的更多相关文章

  1. 单点登录CAS使用记(四):为登录页面加上验证码

    CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...

  2. 傻瓜式教程--实现登录页面的验证码以及验证(VUE)

    做成之后就 是这个样子 接下来上代码创建一个组件.显示验证码图片 <template> <div class="s-canvas"> <canvas ...

  3. pyppeteer 登录一般网站 并利用 http方法获取登录页面的验证码

    主函数 新建浏览器,进行登录,由于验证码的识别准确率不是百分之百,需要多次尝试. async def main(self, username, pwd, url): # 定义main协程函数, log ...

  4. python web框架 Django 登录页面

    在django 项目下 创建一个templates 放模板的文件夹 html文件都放在这里 在里面写一个login.html 登录页面 urls.py 加上 login 对应关系 from djang ...

  5. web自动化-绕过登录

    两个方法: 1.常用的方法: 第一种方法是登录后查看网站的 cookie,请求 url 的时候把 cookie 带上(缺点是:cookie有时间限制.优点:简单,方便) 2.添加cookies的方式: ...

  6. web自动化:前端页面组成

    一.web页面的组成 1. 常用:HTML + CSS + Javascript 2. HTML:定义页面的呈现内容 3. CSS:Cascading Style Sheets,层叠样式表 控制你的网 ...

  7. web自动化之windows页面切换

    一.为什么切换windows页面 在页面操作过程中,存在点击某个元素之后会重新打开一个windows页面,如果不切换至新页面的话,无法在新页面中进行操作,程序会出现报错 二.如何切换 1.获取当前所有 ...

  8. cas sso单点登录系列4_cas-server登录页面自定义修改过程(jsp页面修改)

    转:http://blog.csdn.net/ae6623/article/details/8861065 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标:    ...

  9. SSO单点登录系列4:cas-server登录页面自定义修改过程(jsp页面修改)

    落雨 cas 单点登录 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标:    下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一 ...

随机推荐

  1. php里的$this的 含义

    $this 的含义是表示    实例化后的 具体对象! 我们一般是先声明一个类,然后用这个类去实例化对象! 但是,当我们在声明这个类的时候,想在类本身内部使用本类的属性或者方法.应该怎么表示呢? 例如 ...

  2. V8中的快慢属性(图文分解更易理解)

    出于好奇:js中使用json存数据查找速度快,还是使用数组存数据查找快? 探究V8中对象的实现原理,熟悉数组索引属性.命名属性.对象内属性.隐藏类.描述符数组.快慢属性等等. D8调试工具使用请来这里 ...

  3. True 和 False 分别代表数字中的几?形象地记忆

    True 和 False 作为布尔值分别代表的意思是真和假. 灯泡亮起就是 1,灯泡熄灭就是 0.0 就是无状态,所以可以代表灯泡熄灭的状态,而 1 就是有状态的,所以可以代表灯泡亮起的状态. 那么, ...

  4. rtmp/rtsp/hls公网测试地址

    相信大家在调试播放器的时候,都有这样的困惑,很难找到合适的公有测试源,以下是大牛直播整理的真正可用的直播地址源. 其中,rtmp和rtsp的url,用https://github.com/daniul ...

  5. 对表白墙js文件的解释

    index.js 1 Page({ 2 3 /** 4 * 页面的初始数据 5 */ 6 data: { 7 xcx_appid:"", 8 }, 9 HuoquDaohangLi ...

  6. 2020年12月-第02阶段-前端基础-CSS Day06

    CSS Day06 定位(position) 理解 能说出为什么要用定位 能说出定位的4种分类 能说出四种定位的各自特点 能说出我们为什么常用子绝父相布局 应用 能写出淘宝轮播图布局 1. CSS 布 ...

  7. 通过vNode实现给列表字段打标签

    问题 如何给列表数据打标签?类似下面这种样子 思路 数模转化(对接口请求回来的数据进行过滤标记,返回新的数据) 渲染新的数据模型 实现 1.过滤数据,需要打标签的采用jsx写法 业务数据的处理我封装在 ...

  8. containerd使用总结

    # 安装 yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linu ...

  9. 分布式安装部署MinIO

    官方文档地址:http://docs.minio.org.cn/docs/master/distributed-minio-quickstart-guide 前提条件:分布式Minio至少需要4个硬盘 ...

  10. MySQL学习(1)---MySQL概述

    什么是数据库 概述 数据库(Database)是长期存储在计算机内有组织.大量.共享的数据集合.它可以供各种用户共享,具有最小冗余度和较高的数据独立性.数据库管理系统DBMS(Database Man ...