python 自动化测试(2):针对密码输入框为密码控件时的解决方案
一、前言
使用selenium进行自动化测试,节约了我们的人工和时间成本,增加测试的便利性。然而有些时候selenium也不能完全帮我们解决一些页面问题。我这篇主要写一下遇到有密码控件的输入框时的解决方案。
二、问题
我这里出现的是,pc端登录时会有一个密码控件的安装和输入,就像银行那种输支付密码时会有一个插件的安装,安装好之后才会出现一个输入框。我们知道普通的输入框,使用selenium定位之后,直接send_keys(param)就可以输入成功,但是针对这种密码控件的输入时大部分可能是不管用的。
三、解决方案
使用模拟键盘的方式,将我们所需要的输入的内容输入到密码控件的输入框中即可。而模拟键盘,这里又有很多种方式,我这里采用的是,使用DD插件方式进行输入,相关资源点击 这里 下载。
四、实现
1、首先,将我们已下载的资源解压,放入我们的项目中,可以专门创建lib文件包放入,如图:
2、编写一个InputPasswordUtil.py的文件,源码如下:
import time
from ctypes import windll
lib_path = "\DD94687.64.dll" # 你存入该文件的路径
dd_dll = windll.LoadLibrary(lib_path)
class InputPasswordUtil:
"""
模拟键盘输入密码内容
"""
def input_password(self, password):
vk = {
'5': 205, 'c': 503, 'n': 506, 'z': 501, '3': 203, '1': 201, 'd': 403, '0': 210, 'l': 409, '8': 208,
'w': 302, 'u': 307, '4': 204, 'e': 303, '[': 311, 'f': 404, 'y': 306, 'x': 502, 'g': 405, 'v': 504,
'r': 304, 'i': 308, 'a': 401, 'm': 507, 'h': 406, '.': 509, ',': 508, ']': 312, '/': 510, '6': 206,
'2': 202, 'b': 505, 'k': 408, '7': 207, 'q': 301, "'": 411, '\': 313, 'j': 407, '`': 200, '9': 209,
'p': 310, 'o': 309, 't': 305, '-': 211, '=': 212, 's': 402, ';': 410
}
# 需要组合shift的按键。
vk2 = {
'"': "'", '#': '3', ')': '0', '^': '6', '?': '/', '>': '.', '<': ',', '+': '=', '*': '8', '&': '7',
'{': '[', '_': '-', '|': '\', '~': '`', ':': ';', '$': '4', '}': ']', '%': '5', '@': '2', '!': '1',
'(': '9'
}
def down_up(code):
dd_dll.DD_key(vk[code], 1)
dd_dll.DD_key(vk[code], 2)
def dd(key):
if key.isupper():
# 按下 500是shift键码
dd_dll.DD_key(500, 1)
down_up(key.lower())
dd_dll.DD_key(500, 2)
elif key in r'~!@#$%^&*()_+{}|:"<>?':
dd_dll.DD_key(500, 1)
down_up(vk2[key])
dd_dll.DD_key(500, 2)
else:
down_up(key)
# 依次输入密码字符
for key in password:
dd(key)
time.sleep(0.5)
3、将上面的方法调用到你自己的脚本之中,传入你自己的密码即可;
注意:每个密码控件的限制输入可能是不一样的,我登录的网站,我尝试模拟输入数字、字母和字符组合的密码时,输入是不成功的,有可能时密码控件服务中是写了禁止模拟键盘输入这一类,但是纯数字输入是成功的。针对这一块没有仔细研究,有没有大佬可以指教一下,可以留言给我,谢谢!
PS:之前也没有记录清楚,今天把自己坑了。这个ctypes只支持python2.5以上的版本,不支持python3。特别注意一下
五、关于其他方案
我还看到其他很多种方法模拟键盘输入,比如python借助win32、hook的方式来模拟键盘输入,但是在我这里,输入不成功,我只把代码贴出来,仅供参考,我把参考地址贴到这里: https://blog.csdn.net/qq_38839677/article/details/83374219
import time
from PyUserInput.pykeyboard import PyKeyboard
def input_password(password):
k = PyKeyboard()
for num in password:
time.sleep(1)
k.press_keys(num) # PyKeyBoard中有很多输入方法
print("num", num)
- Form 表单 问题多多(上)
- R语言中的遗传算法
- 跟Google学写代码--Chromium工程中用到的C++11特性
- 兼容IE6 a标签hover特殊效果
- 基于机器学习方法的POI品类推荐算法
- 细说ReactiveCocoa的冷信号与热信号系列(3)
- pageResponse - 移动端适配框架
- R语言与机器学习(分类算法)logistic回归
- 一步步教你弹性框架-上篇
- 【编程基础】C++初学者需掌握的10个C++特性(中)
- 一步步教你弹性框架-中篇
- 细说ReactiveCocoa的冷信号与热信号系列(2)
- 谈谈个人网站的建立(三)—— 定时任务
- 细说ReactiveCocoa的冷信号与热信号系列(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在Java项目中打印错误日志的正确姿势,排查问题更方便,非常实用!
- 开源后台系统*mee-admin*
- stc89c52在Linux或MacOS下使用sdcc和stcgal中断与LCD测试代码
- 豆瓣9.2分!17万条弹幕告诉你《沉默的真相》凭什么口碑高开暴走!
- Shader 入门:GLSL ES(迭代、选择和跳转)
- Github 与 Git,新手初次接触的尴尬历程
- vue-cli3配置路径别名
- 【自动化测试】【Jest-Selenium】(02)—— Jest 匹配器
- 【自动化测试】【Jest-Selenium】(03)—— Jest 异步测试
- 【自动化测试】【Jest-Selenium】(04)—— Selenium WebDriver
- 前端开发"模块打包器"webpack4实战入门
- shadow dom一个最简单的例子
- 程序员必读:Git提交信息和分支创建规范
- 使用brew cask安装minikube的各种错误和解决方法
- 编写高质量可维护的代码:一目了然的注释