3種方式自動化控制APP

不焦躁的程序员發表於2024-04-25

自動化控制APP不管是在工作還是生活方面,都可以幫助我們高效地完成任務,節省時間和精力。本文主要介紹自動化控制APP的3種常用方式。

1、Python + adb

這種方式需要對Android有一些基本的瞭解。adb是一種用於除錯Android應用程式的工具。使用Python和adb可以輕鬆實現自動化控制移動端APP。

1.1、特點

這種方式最簡單,但是控制效果也最粗糙。不同的手機對應的元素x,y軸的位置不同,所以不適合操作不同尺寸的所有手機。這種方式也只適合於開發者,對於普通使用者使用成本過高。

1.2、使用步驟

1、安裝Android SDK

具體細節略過,自行google安裝。安裝完畢後,配置好ANDROID_HOME環境變數。

2、安裝Python

具體細節略過,自行google安裝。

3、開啟手機的開發者模式

同時開啟USB除錯顯示指標位置

4、此時操作手機

可以看到有2根軸,同時最上方會顯示頁面焦點元素的x,y軸位置。

5、使用Python程式碼+adb簡單控制APP

import time
import subprocess

# 點選某個位置
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input tap 564  1861")
time.sleep(2)
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input tap 188  980")
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input tap 869  1808")
time.sleep(4)
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input tap 320  965")
# 輸入資料
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input text 15850501595")
# 按返回鍵
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input keyevent KEYCODE_BACK")
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input tap 512  1120")
# 輸入資料
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input text 15850501595")
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input keyevent KEYCODE_BACK")
subprocess.getoutput(f"adb -s Y2J7N17C27000069 shell input tap 843  1824")

6、adb常用命令

- 檢視手機裝置:adb devices
- 檢視裝置型號:adb shell getprop ro.product.model
- 檢視電池資訊:adb shell dumpsys battery
- 檢視裝置ID:adb shell settings get secure android_id
- 檢視裝置IMEI:adb shell dumpsys iphonesubinfo
- 檢視Android版本:adb shell getprop ro.build.version.release
- 檢視手機網路資訊:adb shell ifconfig
- 檢視裝置日誌:adb logcat
- 重啟手機裝置:adb reboot
- 安裝一個apk:adb install /path/demo.apk
- 解除安裝一個apk:adb uninstall <package>
- 檢視系統執行程序:adb shell ps
- 檢視系統磁碟情況:adb shell ls /path/
- 手機裝置截圖:adb shell screencap -p /sdcard/aa.png
- 手機檔案下載到電腦:adb pull /sdcard/aa.png ./
- 電腦檔案上傳到手機:adb push aa.png /data/local/
- 手機裝置錄影:adb shell screenrecord /sdcard/ab.mp4
- 手機螢幕解析度:adb shell wm size
- 手機螢幕密度:adb shell wm density
- 手機螢幕點選:adb -s xxxxxxxxxxxxxxxxxxxxxxxxx shell input tap xvalue yvalue
- 手機螢幕滑動:adb shell input swipe 1000 1500 200 200
- 手機螢幕帶時間滑動:adb shell input swipe 1000 1500 0 0 1000
- 手機文字輸入:adb shell input text xxxxx
- 手機鍵盤事件:adb shell input keyevent xxxx

2、Android無障礙

這種方式是使用Android無障礙功能實現自動控制APP的效果。需要開啟Android無障礙功能,然後編寫Android程式碼來控制另外的APP應用。

2.1、特點

這種方式需要開發者對Android有一些開發經驗。優點是:可以用Android開發出獨立的apk安裝包,安裝到普通使用者手機裡,方便使用者使用。

2.2、使用步驟

1、安裝Android SDK、安裝Android Studio

具體細節略過,自行google安裝。安裝完畢後,配置好ANDROID_HOME環境變數。

2、使用Android自帶的tool工具

Android在level-21和之前的低版本,安裝完畢後有一個tool工具包,但是高版本移除了此工具包。所以在安裝SDK時還需要加上level-21版本。

使用Android自帶的tool工具,主要是為了檢視APP的頁面佈局和元素。但是monitor已經不可用了,只能使用uiAutormatorViewer

3、利用uiAutormatorViewer工具找到元素資訊

uiAutormatorViewer檢視頁面元素所在的x,y軸的佈局。然後編寫Android程式碼控制點選等效果。此工具顯示出來的介面如下:

4、程式碼示例

AndroidManifest.xml程式碼裡配置無障礙service,然後實現AccessibilityService類,實現onAccessibilityEvent方法。後續手機介面如果有變動,內部會自動觸發呼叫onAccessibilityEvent方法。

public class XXXXXAccessibilityService extends AccessibilityService {
    @Override
    public void onInterrupt() {

    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.e("無障礙", "來了");
        
        // 建立執行緒去執行任務
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 後續程式碼
            }
        }).start();
    }
}

無障礙功能本身也提供了多種尋找頁面元素的方法,比如:

/**
 * 根據ID找元素
 */
private AccessibilityNodeInfo findNodeById(String id) {
    AccessibilityNodeInfo root = getRootInActiveWindow();
    if (root == null) {
        return null;
    }
    List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByViewId(id);
    if (nodeList != null) {
        for (int i = 0; i < nodeList.size(); i++) {
            AccessibilityNodeInfo node = nodeList.get(i);
            if (node != null) {
                return node;
            }
        }
    }
    return null;
}

3、Python + Appium

Python加Appium可以組合成為一種自動化測試工具,可以用於測試和自動化控制移動端APP。

3.1、特點

這種方式可以自動化操作APP,但是使用者基本是開發者,普通使用者很難完成這一系列的操作。但是也有個優點,有些頁面標記為不可點選的元素,透過這種方式是可以點選的。

Appium提供了更多的尋找頁面元素的方式,比如uiautomator、xpath、id等。

3.2、使用步驟

1、安裝Python

此處略過步驟,自行google。

2、安裝Appium

老版本的Appium直接包含了Appium serverAppium inspector,新版本的Appium安裝完畢後,需要在單獨安裝Appium inspector。透過Appium inspector可以檢視手機當前頁面的xml佈局。

# 安裝appium
npm i --location=global appium

# 安裝自動檢視UI頁面的驅動
appium   uiautomator2driver

# 安裝inspector
下載安裝地址:https://github.com/appium/appium-inspector?tab=readme-ov-file

# 啟動server
appium server --use-driver=uiautomator2

# 安裝客戶端,程式碼裡會使用 appium-python-client 與server通訊,
# 然後server在將指令下發到手機裡的appium端
pip3 install appium-python-client

3、使用過程

安裝完畢後,就可以透過Python程式碼控制App了。

  • 啟動Appium-server,appium uiautomator2driver

  • 啟動Appium inspector,配置好手機,然後點選start session,介面如下:

  • 透過Appium inspector檢視頁面佈局和元素,找出目標元素。

  • 編寫程式碼

device_app_info = AppiumOptions()
# 作業系統
device_app_info.set_capability('platformName', 'Android')
# 作業系統版本
# device_app_info.set_capability('platformVersion', '10')
device_app_info.set_capability('platformVersion', '9')
# 裝置名稱
# device_app_info.set_capability('deviceName', '46F4C19402000952')
device_app_info.set_capability('deviceName', 'Y2J7N17C27000069')
# app package
device_app_info.set_capability('appPackage', 'cn.damai')
# app activity name
device_app_info.set_capability('appActivity', '.launcher.splash.SplashMainActivity')
# 使用uiautomator2驅動
device_app_info.set_capability('automationName', 'UiAutomator2')

# 連線appium server,server地址檢視appium啟動資訊
driver = webdriver.Remote('http://127.0.0.1:4723', options=device_app_info)

# 找到元素,控制元素
buy_btn = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("cn.damai:id/trade_project_detail_purchase_status_bar_container_fl")')
if buy_btn:
    buy_btn.click()

4、總結

  • 以上3種方式都可以用於自動化控制移動端APP,但是又各有適用的場景。讀者需根據實際情況選擇其中的一種方式來實現自動化控制。
  • 以上的方式也可以認為是一種爬蟲。還有一些自動化的方式是:先分析api請求,然後逆向分析js或者逆向分析apk包,破解其中的加密方式。然後直接呼叫api,這種方式後面單獨講解。

本篇完結!歡迎點贊 關注 收藏!!!

原文連結:https://mp.weixin.qq.com/s/KVylEo2riiRL8yWHgPloBAhttp://www.mangod.top/articles/2024/04/24/1713970503394.html

======>>>>>> 關於我 <<<<<<======

相關文章