Appium主要是透過呼叫安卓提供的介面來執行命令的,所以需要安裝Java和安卓SDK。
1.安裝Appium服務端
appium的服務端是基於node的,直接使用npm(node包管理器)安裝即可,比較簡單。
npm install -g appium
2.安裝Python客戶端
pip install Appium-Python-Client
同樣直接使用pip安裝即可。
3.安裝Java環境
brew tap AdoptOpenJDK/openjdk
brew install adoptopenjdk8
配置環境變數
JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
CLASS_PATH="$JAVA_HOME/lib"
PATH=".$PATH:$JAVA_HOME/bin"
export PATH=/usr/local/bin:$PATH
4.安裝安卓SDK
brew install --cask android-platform-tools
配置環境變數:
export ANDROID_HOME=/Users/xxx/Library/Android/sdk
其中xxx為使用者名稱。
完成之後,將安卓手機連線到電腦,注意手機的開發者許可權之類的全部開啟。
然後執行 adb devices
,可以顯示裝置,則安裝成功。
其實透過brew安裝的軟體預設在命令列是可以直接開啟不用配置環境變數的,因為brew設定了軟連結,但是appium的服務無法讀取到,所以上面還是需要配置一下。
5.連線測試
根據上面的配置之後,環境基本安裝完畢,下面來測試一下,首先啟動appium服務端。
命令列執行:appium,出現歡迎介面則沒有問題。
主要是測試一下 Appium Inspector,這個是Appium提供的檢視手機app元素以及其它功能的桌面軟體,可以大大提升開發效率。
下載開啟這個軟體,遠端主機、埠、路徑都使用預設不填即可,主要填一下右下角的 JSON Representation:
'platformName': 'Android', # 被測手機是安卓
'automationName' : 'UiAutomator2',
'appPackage': 'tv.danmaku.bili', # 啟動APP Package名稱
'appActivity': '.ui.splash.SplashActivity', # 啟動Activity名稱
'unicodeKeyboard': True, # 使用自帶輸入法,輸入中文時填True
'resetKeyboard': True, # 執行完程式恢復原來輸入法
'noReset': True, # 不要重置App 'newCommandTimeout': 6000,
填上最前面的platformName和automationName就可以,其它都是選配。
6.python程式碼測試
執行官網的python示例程式碼:
import unittest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
capabilities = dict(
platformName="Android",
automationName="uiautomator2",
deviceName="Android",
appPackage="com.android.settings",
appActivity=".Settings",
)
appium_server_url = "http://localhost:4723"
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote(
appium_server_url,
options=UiAutomator2Options().load_capabilities(capabilities),
)
def tearDown(self) -> None:
if self.driver:
self.driver.quit()
def test_find_battery(self) -> None:
el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="電池"]')
el.click()
if __name__ == "__main__":
unittest.main()
成功則表示正常連線