關於銀行等帶有安全控件插件的輸入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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM