前言
最近在做与银行等第三方交互的UI测试发现,selenium对带有安全控件的输入框senkeys不起作用,此时需要换思路解决。放弃selenium的输入。以下是自己整理的解决方案,供大家参考,如有不对,请指正。
解决方案
采用第三方虚拟键盘DD XOFT(完美解决),这种方案持续集成不方便,或者暂未找到解决方案(待研究);
采用autoi调用银行插件,最后转成可执行.exe文件,在代码中直接调用,前提是每次都需要安装安全控件,目前,我所在项目只需要安装一次;
场景描述
再利用selenium做自动化测时候,遇到带有安全插件的密码输入框:
第一 次需要安装:
安装以后:
实现代码
1.本次利用python代码实现输入代码:
#!/usr/bin/env python
from ctypes import *
import time
import os
import win32api
class dd_input():
def __init__(self):
parentDirPath = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
path = parentDirPath + ("\\dll\\DD81200x64.64.dll")
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', '?': '/', '>': '.', '<': ',', '+': '=', '*': '8', '&': '7', '{': '[', '_': '-',
'|': '\\', '~': '`', ':': ';', '$': '4', '}': ']', '%': '5', '@': '2', '!': '1', '(': '9'}
def down_up(self, code):
# 进行一组按键。
self.dd_dll.DD_key(self.vk[code], 1)
self.dd_dll.DD_key(self.vk[code], 2)
def dd(self, i):
# 500是shift键码。
if i.isupper():
# 如果是一个大写的玩意。
# 按下抬起。
self.dd_dll.DD_key(500, 1)
self.down_up(i.lower())
self.dd_dll.DD_key(500, 2)
elif i in '~!@#$%^&*()_+{}|:"<>?':
# 如果是需要这样按键的玩意。
self.dd_dll.DD_key(500, 1)
self.down_up(self.vk2[i])
self.dd_dll.DD_key(500, 2)
else:
self.dd_dll.DD_key(203, 1)
self.dd_dll.DD_key(203, 1)
self.dd_dll.DD_key(203, 1)
self.dd_dll.DD_key(203, 1)
self.dd_dll.DD_key(203, 1)
self.dd_dll.DD_key(203, 1)
# # self.dd_dll.DD_key(206, 1)
# # self.dd_dll.DD_key(204, 1)
# # self.dd_dll.DD_key(202, 1)
# # self.dd_dll.DD_key(203, 1)
# # self.dd_dll.DD_key(205, 1)
# # self.dd_dll.DD_key(209, 1)
# input("按任意键继续...")
# 之后等待两秒。
time.sleep(2)
# 测试按键。
# 释放dll
def shifang(self):
win32api.FreeLibrary(self.dd_dll._handle)
if __name__ == "__main__":
dd_input = dd_input()
for i in '3642359':
dd_input.dd(i)
for i in '3642359':
dd_input.dd(i)
dd_input.shifang()'''
2.调用代码:
def chongzhi(self, username):
self.home.home()
self.login.login(username, "xxxxxxxx")
time.sleep(5)
freeAmt_q = self.cz.huoqu_freeAmt().replace(',', '')
print("充值前可用余额为:" + freeAmt_q)
czje = 200000.00
self.cz.chongzhi()
self.lf.click_huoqu()
self.lf.input_smsCode()
self.lf.input_mima()
time.sleep(5)
for i in '3642359':
self.dd_input.dd(i)
for i in '3642359':
self.dd_input.dd(i)
self.dd_input.shifang()
time.sleep(5)
self.lf.click_querenzhifu()
time.sleep(10)
self.driver.refresh()
time.sleep(10)
self.driver.refresh()
time.sleep(10)
freeAmt_h = self.cz.huoqu_freeAmt().replace(',', '')
print("充值后可用余额为:" + freeAmt_h)
# 转换成float参与运算,然后转成字符串,在取字符串值保留两位小数转成字符串进行assertEquals断言
x = str("%.2f" % eval(str(float(freeAmt_q)+czje)))
self.assertEqual(freeAmt_h, x, msg="充值成功!")
总结
以上代码实现自动输入,在集成到Jenkins上遇到问题,将执行函数写成批处理在执行过程中无法调用DD81200x64.64.dll,有时间在研究。
dd虚拟键盘地址:http://www.ddxoft.com/