前言
最近在做與銀行等第三方交互的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/
