关于银行等带有安全控件插件的输入selenium无法sendkeys的解决方案

前言

最近在做与银行等第三方交互的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/

posted @ 2018-10-16 18:20  丶墨尘丶  阅读(5427)  评论(18)    收藏  举报