使用uiautomator2實(shí)現(xiàn)對手機(jī)app的操作(windows)

本文將介紹如何使用uiautomator2對手機(jī)app進(jìn)行點(diǎn)擊、翻頁、滑動等操作,本次目標(biāo)app為考研幫

為什么要使用uiautomator2 ?

  1. 化境搭建便捷
  2. UI控件識別有專業(yè)的工具(weditor),可視化好
  3. UI自動化編寫采用python,學(xué)習(xí)成本低,并且文檔為中文文檔,非常友好
  4. UI自動化腳本運(yùn)行穩(wěn)定。

uiautomator2 支持的環(huán)境

  1. Android版本 4.4 +
  2. Python 3.6 + (3.8暫不支持)

首先在我們本機(jī)進(jìn)行adb工具安裝,那么什么是adb工具呢?adb工具全稱(Android調(diào)試橋)命令行窗口,用于通過電腦端與模擬器或者是設(shè)備之間的交互。adb工具包含以下3個部分
?- adb client :命令行程序,“adb”用于從shell或者腳本中運(yùn)行adb命令
?- adb server: ADB Server是運(yùn)行在PC上的一個后臺進(jìn)程
?- adbd: 程序“adbd” 作為一個后臺進(jìn)程在Android設(shè)備或者模擬器系統(tǒng)中運(yùn)行
adb能用來做什么?
可以安裝卸載apk、移動設(shè)備和PC之間拷貝文件、查看設(shè)備上安裝的應(yīng)用信息、文件管理、按鍵操作等等。

下面我們通過安裝夜神模擬器來安裝adb工具,安裝完夜神模擬器后進(jìn)入以下目錄進(jìn)行查看,并且將D:\夜神模擬器\Nox\bin 路徑添加到系統(tǒng)環(huán)境變量中。
夜神安裝目錄

隨后我們打開cmd,并且輸入adb后回車,顯示以下內(nèi)容說明adb工具是安裝成功的。
adb命令
打開夜神模擬器上創(chuàng)建的Android設(shè)備,注意,在創(chuàng)建Android時,一定要將網(wǎng)絡(luò)橋接打開
網(wǎng)絡(luò)設(shè)置

并在cmd命令行輸入adb devices,如下輸出說明已成功連接上模擬器上的移動設(shè)備,如果連接的是真機(jī)將會顯示一串英文字母
adb devices

考研幫App安裝,首先將考研幫的apk文件下載到本地,然后執(zhí)行 adb install 文件(apk)路徑,如下顯示安裝成功
應(yīng)用安裝
應(yīng)用安裝
同時我們可以通過 adb uninstall 包名(com.tal.kaoyan) 來卸載app,那么包名如何查看呢?執(zhí)行 adb shell pm list packages 可以查看所有已安裝的所有應(yīng)用包名,找到想卸載包命即可。

uiautomator2 項目初始化

  1. 通過 pip install uiautomator2 在python環(huán)境下安裝uiautomator2包。
  2. 在cmd命令行python -m uiautomator2 init (python37 -m uiautomator2 init)對夜神模擬器上的移動設(shè)備進(jìn)行一個初始化,也就是在移動設(shè)備上安裝一個Agent,如下圖所示
    初始化

    初始話成功后會在移動設(shè)備上安裝一個小汽車(ATX)的圖標(biāo),如圖所示
    初始化
    完成以上操作后我們就可以通過代碼來獲取一些手機(jī)信息了。
  3. uiautomator2連接移動設(shè)備,移動設(shè)備的連接方式有多種,本次采用wifi的形式連接,首先查看移動設(shè)備的ip
    查看ip

    完成以上準(zhǔn)備工作后,我們就可以對設(shè)備進(jìn)行操作了

import time
import uiautomator2 as u2
#通過手機(jī)(夜神模擬器)wifi來進(jìn)行連接,需要查看手機(jī)(夜神模擬器)的ip
d = u2.connect_wifi("192.168.0.100")
print(d.device_info)    # 查看設(shè)備信息
# uiautomator服務(wù)的啟動
d.uiautomator.start()
time.sleep(2)
# 查看uiautomator的運(yùn)行狀態(tài),是否在運(yùn)行
print(d.uiautomator.running())
 # uiautomator服務(wù)的關(guān)閉
d.uiautomator.stop()
time.sleep(2)
# 查看uiautomator的運(yùn)行狀態(tài)
print(d.uiautomator.running())
# 查看atx-agent運(yùn)行狀態(tài)
print(d.agent_alive)
# 查看屏幕的分辨率信息
print(d.window_size())
# 查看獲取到的ip地址  注意:模擬器獲取和真機(jī)不同,模擬器獲取的是錯誤的
print(d.wlan_ip)
# 打開 考研幫 app
d.app_start("com.tal.kaoyan")
time.sleep(15)
# 關(guān)閉app
d.app_stop("com.tal.kaoyan")
# 獲取當(dāng)前前臺運(yùn)行的app信息
print(d.app_current())
# 獲取app詳細(xì)信息
print(d.app_info(package_name="com.tal.kaoyan"))
#清除app緩存
d.app_clear(package_name="com.tal.kaoyan")
# 獲取所有app的列表
print(d.app_list())
#獲取正在運(yùn)行的app列表
print(d.app_list_running())
# 卸載app
d.app_uninstall("com.tal.kaoyan")
# 卸載所有的app, 卸載所有的第三方包,u2項目包不會卸載
d.app_uninstall_all()
#通過app_install 方法安裝apk,傳入app下載地址
d.app_install("http://xxxxxxxxxxxxxxx")

安裝weditor

pip install weditor  -i https://pypi.tuna.tsinghua.edu.cn/simple

weditor啟動

直接在CMD命令行輸入weditor
weditor啟動

直接訪問http://192.168.0.109:17310
weditor
weditor的使用還是比較簡單和方便的,在次就不再依次介紹了,可通過查閱相關(guān)文檔進(jìn)行學(xué)習(xí)。以下就是完成考研幫app的登錄并滑動頁面的代碼。
import uiautomator2 as u2

class HandleKaoyanbang:
    def __init__(self, ip_addr="192.168.0.108"):
        # 當(dāng)前是通過wifi的方法來連接移動設(shè)備
        self.d = u2.connect_wifi(ip_addr)
        self.size = self.get_windowsize()
        self.handle_watcher()
    def handle_watcher(self):
        """定義一個監(jiān)控器"""
        #監(jiān)控器會單獨(dú)啟動一個線程
        # 點(diǎn)擊彈出的用戶隱私協(xié)議
        self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/tip_commit"]').click()       #參數(shù)傳入xpath路徑
        # 廣告點(diǎn)擊取消
        self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/tv_skip"]').click()
        # 監(jiān)控器寫好之后,要通過start方法來啟動
        self.d.watcher.start()

    def get_windowsize(self):
        """獲取手機(jī)屏幕的大小"""
        return self.d.window_size()

    def close_app(self):
        # 監(jiān)控器關(guān)閉
        self.d.watcher.stop()
        # 停止考研幫app
        self.d.app_stop("com.tal.kaoyan")
        # 清理緩存
        self.d.app_clear("com.tal.kaoyan")

    def handle_kaoyanbang_app(self):
        """啟動考研幫app,并實(shí)現(xiàn)自動化操作"""
        self.d.app_start(package_name="com.tal.kaoyan")
        # 在點(diǎn)擊之前需要判斷控件是否存在
        self.d(text='密碼登錄').click_exists(timeout=10)
        # 通過找到相關(guān)控件之后,文本控件,set_text這個方法來輸入文字
        if self.d.wait_activity("com.kaoyan.kylogin.ui.login.LoginActivity", timeout=10):
            self.d(resourceId="com.tal.kaoyan:id/login_email_edittext").set_text("你的個人賬號")
            # 輸入密碼
            self.d.xpath('//*[@resource-id="com.tal.kaoyan:id/kylogin_unamelogin_operate_layout"]/android.widget.RelativeLayout[1]').set_text("登錄密碼")
            self.d.click(361, 657)   # 點(diǎn)擊登錄按鈕
        if self.d.wait_activity("com.tal.kaoyan.ui.activity.HomeTabActivity", timeout=10):
            self.d(text='研訊').click_exists(timeout=10)
            # 獲取到屏幕的中心點(diǎn),x軸
            # 再獲取到y(tǒng)軸遠(yuǎn)方點(diǎn),獲取到y(tǒng)軸近點(diǎn)(y軸坐標(biāo)從下向上越來越小)
            x1 = int(self.size[0] * 0.5)
            y1 = int(self.size[1] * 0.9)
            y2 = int(self.size[1] * 0.15)
            while True:
                # get toast,是安卓系統(tǒng)系統(tǒng)的一個信息提示操作
                if self.d.toast.get_message(0) == "內(nèi)容已經(jīng)全部加載完了":
                    self.close_app()
                    break
                # 開始滑動研訓(xùn)進(jìn)行翻頁操作
                self.d.swipe(x1, y1, x1, y2)

if __name__ == "__main__":
    k = HandleKaoyanbang()
    k.handle_kaoyanbang_app()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容