如何在Appium中使用AI定位


當我們在寫自動化測試腳本的時候,傳統情況下一定要知道元素的屬性,如id、name、class等。那么通過AI的方式定位元素可能就不需要知道元素的屬性,評價人對元素的判斷來定位,比如,看到一個搜索框,直接使用ai:search來定位, 或者我想定位一個關閉按鈕,之直接使用 ai:close,我們並不需要知道這搜索框和關閉按鈕的屬性。

appium 通過插件的方式可以支持AI定位。為體驗一個這種定位方式我花了兩周時間。


### 系統要求

首先,需要一些系統依賴項來處理圖像。

  • macOS
brew install pkg-config cairo pango libpng jpeg giflib
  • Linux
sudo apt-get install pkg-config libcairo2-dev libpango* libpng-dev libjpeg-dev giflib*
  • Windows

暫不支持。

如果遇到問題,您可能必須單獨安裝每個包。

我一開始在Windows試了半天不成功,因為我有現成的appium環境,后來發現壓根不支持,於是,換成了macOS, 所以后面的操作在macOS下完成,當然,如果你有Linux環境,我覺得也是OK的。


### 安裝 Android Studio

因為我要操作的移動設備是Android, 所以需要安裝Android SDK, 那么Android Studio集成了Android SDK。

下載android studio: https://developer.android.com/studio

在安裝Android Studio的過程中需要設置android SDK的路徑,我的路徑為:

/Users/tech/Library/Android/sdk

然后,需要配置環境變量:sudo vi ~/.bash_profile

ANDROID_HOME=/Users/tech/Library/Android/sdk
PATH=${PATH}:${ANDROID_HOME}/platform-tools
PATH=${PATH}:${ANDROID_HOME}/tools

最后,使配置生效:source ~/.bash_profile


### 安裝appium

1、不要使用appium-desktop, 通過命令方式安裝appium。

> brew install node      # get node.js
> npm install -g appium  # get appium

2、安裝appium-doctor

> npm install appium-doctor

3、通過appium-doctor命令檢查環境:

> appium-doctor
info AppiumDoctor Appium Doctor v.1.11.0
info AppiumDoctor ### Diagnostic for necessary dependencies starting ###
info AppiumDoctor  ✔ The Node.js binary was found at: /usr/local/bin/node
info AppiumDoctor  ✔ Node version is 10.15.1
WARN AppiumDoctor  ✖ Xcode is NOT installed!
info AppiumDoctor  ✔ Xcode Command Line Tools are installed in: /Library/Developer/CommandLineTools
info AppiumDoctor  ✔ DevToolsSecurity is enabled.
info AppiumDoctor  ✔ The Authorization DB is set up properly.
WARN AppiumDoctor  ✖ Carthage was NOT found!
info AppiumDoctor  ✔ HOME is set to: /Users/tech
info AppiumDoctor  ✔ ANDROID_HOME is set to: /Users/tech/Library/Android/sdk
info AppiumDoctor  ✔ JAVA_HOME is set to: /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
info AppiumDoctor  ✔ adb exists at: /Users/tech/Library/Android/sdk/platform-tools/adb
info AppiumDoctor  ✔ android exists at: /Users/tech/Library/Android/sdk/tools/android
info AppiumDoctor  ✔ emulator exists at: /Users/tech/Library/Android/sdk/tools/emulator
info AppiumDoctor  ✔ Bin directory of $JAVA_HOME is set
...

### appium AI 插件

GtiHub地址:https://github.com/testdotai/appium-classifier-plugin

使用Appium 1.9.2-beta版以上。另外,一定要使用 XCUITest 驅動程序(用於iOS)或UiAutomator2或Espresso驅動程序(用於Android)。較老的iOS和Android驅動程序不支持所需的Appium在任何情況下,都不推薦使用。


### Classifier 設置

要使這個插件對Appium可用,只需轉到主appium項目的安裝目錄下面,並運行:

> cd /usr/local/lib/node_modules/appium
> npm install test-ai-classifier

將這個插件安裝到Appium的依賴樹中,並使其可用。

我在安裝這個插件的時候各種報錯,你可以試試下面的命令。

> sudo npm --registry http://registry.npm.taobao.org install test-ai-classifier  --unsafe-perm

### 使用

1、通過命令的方式啟動appium

> appium
[Appium] Welcome to Appium v1.14.0
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
...

2、編寫自動化測試腳本:

from appium import webdriver
from time import sleep


CAPS = {
    "deviceName": " MEIZU_E3",
    "automationName": "UiAutomator2",
    "platformName": "Android",
    "platformVersion": "7.1.1",
    "appPackage": " com.meizu.flyme.flymebbs",
    "appActivity": ".ui.LoadingActivity",
    "noReset": True,
    "unicodeKeyboard": True,
    "resetKeyboard": True,
    "customFindModules": {"ai": "test-ai-classifier"},
    "testaiConfidenceThreshold": 0.1,
    "shouldUseCompactResponses": False,
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', CAPS)
sleep(3)

# 用 AI 定位到搜索框
driver.find_element_by_custom("ai:search").click()
sleep(5)
driver.find_element_by_id("com.meizu.flyme.flymebbs:id/kf").send_keys("flyme")

driver.find_element_by_id("com.meizu.flyme.flymebbs:id/o7").click()
result = driver.find_elements_by_id("com.meizu.flyme.flymebbs:id/a2a")[0].text
print(result)

driver.quit()
  • automationName
    如果要測試的是Android的話,必須要指為UiAutomator2Espresso

  • customFindModules
    必須要指定為 {"ai": "test-ai-classifier"}

  • testaiConfidenceThreshold
    此功能決定了考慮元素的最低置信度。默認情況下,值為0.2。參數介於0和1之間的數字,其中1表示信心必須完美,0表示根本不需要信任。

  • shouldUseCompactResponses
    這指示appium在找到元素時包含有關元素的額外信息,這大大加快了獲取此插件的輸入過程。

最終,我要體驗的代碼就是這一行:

driver.find_element_by_custom("ai:search").click()

通過ai來定位搜索框。

確實定位到了,可是定位的速度特別慢,大概需要10~20秒。

如果,你想知道 appium-classifier-plugin支持那些類型的元素定位,看這里:https://github.com/testdotai/appium-classifier-plugin/blob/master/lib/labels.js

目前支持100多種類型。


免責聲明!

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



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