1. 程式人生 > >使用Python+uiautomator2實現手機鎖屏解鎖(期望輸入的鎖屏密碼,基於滑動解鎖)

使用Python+uiautomator2實現手機鎖屏解鎖(期望輸入的鎖屏密碼,基於滑動解鎖)

業務需求:需要測試手機滑動解鎖失敗時事件的次數及等待的時間,本來想利用Python+Appium實現,但是Appium執行時自動給我解鎖了....

python-uiautomator2是一個自動化測試開源工具,僅支援Android平臺的原生應用測試

python-uiautomator2封裝了谷歌自帶的uiautomator2測試框架,提供便利的python介面。他允許測試人員直接在PC上編寫Python的測試程式碼,操作手機應用,完成自動化,大大提高了自動化程式碼編寫的效率

以下圖片使用Windows畫圖軟體

如圖所示,python-uiautomator2主要分為兩個部分,python客戶端,移動裝置

  • python端: 執行指令碼,並向移動裝置傳送HTTP請求
  • 移動裝置:移動裝置上運行了封裝了uiautomator2的HTTP服務,解析收到的請求,並轉化成uiautomator2的程式碼。

整個過程

  1. 在移動裝置上安裝atx-agent(守護程序), 隨後atx-agent啟動uiautomator2服務(預設7912埠)進行監聽
  2. 在PC上編寫測試指令碼並執行(相當於傳送HTTP請求到移動裝置的server端)
  3. 移動裝置通過WIFI或USB接收到PC上發來的HTTP請求,執行制定的操作

安裝工具

  • Python2或者Python3均可。(也可以嘗試使用Android上Python客戶端:
    QPython
    )
  • 移動裝置

環境搭建

安裝adb

安裝python-uiautomator2

pip install --pre -U uiautomator2

裝置安裝atx-agent

首先裝置連線到PC,並能夠adb devices發現該裝置。

# 從github下載atx-agent檔案,並推送到手機。在手機上安裝包名為`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success

最後提示success,代表atx-agent初始化成功。

應用及操作

呼叫uiautomator2的過程

  1. 配置手機裝置引數,設定具體操作的是哪一臺手機
  2. 抓取手機上應用的控制元件,制定對應的控制元件來進行操作
  3. 對抓取到的控制元件進行操作,比如點選、填寫引數等。

配置手機裝置引數

python-uiautomator2連線手機的方式有兩種,一種是通過WIFI,另外一種是通過USB。兩種方法各有優缺點。
WIFI最便利的地方要數可以不用連線資料線,USB則可以用在PC和手機網路不在一個網段用不了的情況。

  1. 使用WIFI連線

    手機獲取到手機的IP,並確保電腦可以PING通手機。手機的IP可以在設定-WIFI設定裡面獲取到。
    比如手機的IP是192.168.0.100,連線裝置的程式碼為

    import uiautomator2 as u2
    d = u2.connect('192.168.0.100')
    
  2. 使用USB連線

    手機的序列號可以通過adb devices獲取到,假設序列號是123456f,連線程式碼為

    import uiautomator2 as u2
    d = u2.connect_usb('123456f')
    

抓取手機上應用的控制元件

我這裡使用的weditor,

1.終端中輸入 pip install weditor安裝weditor 

2.終端中輸入python -m weditor啟動weditor 

下圖為網頁的截圖

然後再選取元素定位就可以完成本次需求

程式碼如下:

#_*_ coding:utf-8_*_
import uiautomator2 as u2
import re
import time

STOP_COUNT=150
d = u2.connect()

#輸入滑動解鎖碼
def do_password(count):
    #通過weditor獲取到的圖案位置
    d.swipe_points([(0.304, 0.431), (0.507, 0.435), (0.5, 0.636)], 0.1)


#檢驗是否輸入正確
def do_check():
    #檢查輸入密碼是否達到現在
    if d(resourceId="android:id/message").exists:
        message = d(resourceId="android:id/message").get_text()
        #取得輸密碼的次數
        times = re.findall('\d+', message)[0]
        #需要等待的時間
        timeout = re.findall('\d+', message)[1]
        print("暫時不能輸入密碼,這是第$s次輸入,需要等待%s才可以再次輸入" % (times, timeout))
        return True, times, timeout
    else:
        print("可以輸入")
        return False, 0, 0


count = 0

while True:
    ret, times, timeout = do_check()
    if ret:
        d.screenshot(times + "times_" + timeout + "s.jpg")
        if int(times) >= STOP_COUNT:
            break
        time.sleep(int(timeout))
        d(resourceId="android:id/button3").click()
    count = count + 1
    do_password(count)

效果圖: