python 自動化測試(2):針對密碼輸入框爲密碼控件時的解決方案

一、前言

        使用selenium進行自動化測試,節約了我們的人工和時間成本,增加測試的便利性。然而有些時候selenium也不能完全幫我們解決一些頁面問題。我這篇主要寫一下遇到有密碼控件的輸入框時的解決方案。

二、問題

        我這裏出現的是,pc端登錄時會有一個密碼控件的安裝和輸入,就像銀行那種輸支付密碼時會有一個插件的安裝,安裝好之後纔會出現一個輸入框。我們知道普通的輸入框,使用selenium定位之後,直接send_keys(param)就可以輸入成功,但是針對這種密碼控件的輸入時大部分可能是不管用的。

三、解決方案

        使用模擬鍵盤的方式,將我們所需要的輸入的內容輸入到密碼控件的輸入框中即可。而模擬鍵盤,這裏又有很多種方式,我這裏採用的是,使用DD插件方式進行輸入,相關資源點擊 這裏 下載。

四、實現

        1、首先,將我們已下載的資源解壓,放入我們的項目中,可以專門創建lib文件包放入,如圖:

        2、編寫一個InputPasswordUtil.py的文件,源碼如下:

import time
from ctypes import windll

lib_path = "\\DD94687.64.dll"    # 你存入該文件的路徑
dd_dll = windll.LoadLibrary(lib_path)


class InputPasswordUtil:
    """
        模擬鍵盤輸入密碼內容
    """
    def input_password(self, password):
        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的按鍵。
        vk2 = {
               '"': "'", '#': '3', ')': '0', '^': '6', '?': '/', '>': '.', '<': ',', '+': '=', '*': '8', '&': '7',
               '{': '[', '_': '-', '|': '\\', '~': '`', ':': ';', '$': '4', '}': ']', '%': '5', '@': '2', '!': '1',
               '(': '9'
        }

        def down_up(code):
            dd_dll.DD_key(vk[code], 1)
            dd_dll.DD_key(vk[code], 2)

        def dd(key):
            if key.isupper():
                # 按下 500是shift鍵碼
                dd_dll.DD_key(500, 1)
                down_up(key.lower())
                dd_dll.DD_key(500, 2)
            elif key in r'~!@#$%^&*()_+{}|:"<>?':
                dd_dll.DD_key(500, 1)
                down_up(vk2[key])
                dd_dll.DD_key(500, 2)
            else:
                down_up(key)

        # 依次輸入密碼字符
        for key in password:
            dd(key)
            time.sleep(0.5)

         3、將上面的方法調用到你自己的腳本之中,傳入你自己的密碼即可;

 注意:每個密碼控件的限制輸入可能是不一樣的,我登錄的網站,我嘗試模擬輸入數字、字母和字符組合的密碼時,輸入是不成功的,有可能時密碼控件服務中是寫了禁止模擬鍵盤輸入這一類,但是純數字輸入是成功的。針對這一塊沒有仔細研究,有沒有大佬可以指教一下,可以留言給我,謝謝!

PS:之前也沒有記錄清楚,今天把自己坑了。這個ctypes只支持python2.5以上的版本,不支持python3。特別注意一下

 五、關於其他方案

        我還看到其他很多種方法模擬鍵盤輸入,比如python藉助win32、hook的方式來模擬鍵盤輸入,但是在我這裏,輸入不成功,我只把代碼貼出來,僅供參考,我把參考地址貼到這裏: https://blog.csdn.net/qq_38839677/article/details/83374219

import time

from PyUserInput.pykeyboard import PyKeyboard


def input_password(password):
    k = PyKeyboard()
    for num in password:
        time.sleep(1)
        k.press_keys(num)  # PyKeyBoard中有很多輸入方法
        print("num", num)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章