一、场景描述
最近在做web端的UI自动化测试,涉及与第三方页面的交互,发现selenium对带有安全控件,U盾的输入框使用senkeys方法不起作用,无法正常输入内容,此时放弃selenium的输入,更换其他思路。
- python模拟鼠标键盘操作pymouse、pykeyboard,失败!
- python win32con,win32api中的键盘,鼠标方法,失败!
- 系统事件的拷贝和粘贴,Ctrl+C,Crtl+V,失败!
- 操作系统的键盘事件输入,DD插件,成功!
问题总结,测试的时候发现,当使用U盾时,任务管理器的进程中会启动多个安全输入的进程,当杀死进程时,手动输入密码也不会成功,因此想到会不会是程序级的操作鼠标键盘层级太高,被监测到而无法输入,因此想到使用较为底层的DD插件,经过尝试发现是可行的,但是输入成功率较低
采用第三方虚拟键盘DD XOFT,通过系统的键鼠事件输入,控件键鼠完成安全控件的输入 官网地址 http://www.ddxoft.com 下载一个名为DD81200x64.64.dll的插件(其实就是在它官方群的文件中下载的)。
以下是官方的Python Demo代码,先在本地尝试能否运行
from ctypes import *
import time
print("Load DD!")
path = r'C:\Users\Administrator\Downloads\master-master\master-master\Example\App_python\vs2017\DD\DD94687.64.dll'
dd_dll = windll.LoadLibrary(path)
time.sleep(2)
print("dd_dll:",dd_dll)
st = dd_dll.DD_btn(0) #DD Initialize
print("st:",st)
if st==1:
print("OK")
else:
print("Error")
exit(101)
print("Keyboard Left win")
#LWin is 601 in ddcode, 1=down, 2=up.
dd_dll.DD_key(601, 1)
dd_dll.DD_key(601, 2)
time.sleep(2)
print("Mouse move abs.")
dd_dll.DD_mov(200, 200)
time.sleep(2)
print("Mouse move rel.")
dd_dll.DD_movR(50, 50)
time.sleep(2)
print("Mouse Right button ")
#1==L.down, 2==L.up, 4==R.down, 8==R.up, 16==M.down, 32==M.up
dd_dll.DD_btn(4)
dd_dll.DD_btn(8)
time.sleep(2)
代码运行条件: 1、电脑安装DirectX C++库 2、使用管理员打开Pycharm工具或者使用管理员打开cmd窗口,运行Python文件 3、进入BIOS,查找“secure boot”选项,设置成“disable”,或改以传统方式启动。
Demo文件运行成功,就可以将按键输入与自动化的代码组合在一起进行代码编写了
以下是比较全的使用DD实现账号密码输入
from ctypes import *
import time
import os
import win32api
class op_keyboard():
def __init__(self):
parentDirPath = os.path.dirname(os.path.abspath(__file__))
path = parentDirPath + ("\\DD94687.64.dll") # 这个dll是当前路径下面的
print(path)
self.dd_dll = windll.LoadLibrary(path)
# DD虚拟码,可以用DD内置函数转换。
self.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的按键。
self.vk2 = {'"': "'", '#': '3', ')': '0', '^': '6', '?': '/', '>': '.', '
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?