python appium 快速上手教程
2024年4月22日大约 3 分钟约 908 字
appium
appium 环境安装
- node.js的18版本和20版本在安装appium驱动时会报错,因此需要安装node.js的16版本。
# 切换nodejs版本到16版本
nvm install 16
nvm use 16
node -v
# 安装appium
npm install -g appium
appium driver install uiautomator2
appium driver list
winget install "Appium Inspector"
pip install Appium-Python-Client
# 安装Java JDK
winget install "Java SE Development Kit 22"
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-22", [System.EnvironmentVariableTarget]::Machine)
# [Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));%JAVA_HOME%\bin", [EnvironmentVariableTarget]::Machine)
# 安装Android SDK
winget install Google.AndroidStudio
mkdir -p C:\Android\Sdk
C:\Program Files\Android\Android Studio\bin\studio64.exe
# 打开studio,通过SDK Manager,设置sdk根目录为C:\Program Files\Android\Sdk,安装 sdk tools、sdk plaform-tools、sdk build-tools、sdk Command-line Tools、CMake
cp "C:\Android\Sdk\cmdline-tools\latest\bin\apkanalyzer.bat" "C:\Android\Sdk\"
[System.Environment]::SetEnvironmentVariable("ANDROID_HOME", "C:\Android\Sdk", [System.EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));%ANDROID_HOME%\build-tools\34.0.0", [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));%ANDROID_HOME%\platform-tools", [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));%ANDROID_HOME%\tools\bin", [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));%ANDROID_HOME%\cmake\3.22.1\bin", [EnvironmentVariableTarget]::Machine)
# [System.Environment]::SetEnvironmentVariable("NODE_PATH", "%APPDATA%\npm\node_modules", [System.EnvironmentVariableTarget]::Machine)
# [Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));%APPDATA%\npm\node_modules", [EnvironmentVariableTarget]::Machine)
# 下面是其他依赖的安装,也可以忽略
npm install -g appium-doctor
appium-doctor --android
appium-doctor --ios
winget install Gyan.FFmpeg
npm install -g mjpeg-consumer
npm install -g opencv4nodejs --ignore-scripts
# 下载:https://github.com/google/bundletool/releases/ ,并保存为 "C:\Android\Sdk\bundle-tools\bundletool.jar"
[Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));C:\Program Files\Android\Sdk\bundle-tools", [EnvironmentVariableTarget]::Machine)
winget install GStreamer -i
[Environment]::SetEnvironmentVariable("PATH", "$([Environment]::GetEnvironmentVariable('PATH', [EnvironmentVariableTarget]::Machine));D:\gstreamer\1.0\msvc_x86_64\bin", [EnvironmentVariableTarget]::Machine)
appium Python 客户端测试
adb connect 127.0.0.1:50000 # 添加一个手机设备
adb devices # 查看设备
# 请将需要测试的app在手机前台打开它,然后运行下面命令,查看第一行的cmp字段展示当前打开的app的包名和activity
adb shell dumpsys activity activities | Select-String "mFocusedActivity"
adb shell dumpsys activity recents | Select-String "intent={"
appium # 启动appium服务器
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
capabilities = {
'platformName': 'Android',
'automationName': 'uiautomator2',
'deviceName': '127.0.0.1:50000', # 安卓手机随意填写
'appPackage': 'com.xingin.xhs', # 启动APP的包名
'appActivity': '.index.v2.IndexActivityV2', # 启动Activity名,相当于界面名
# 以下是附加选项
'unicodeKeyBoard': True, # 使用自带输入法(用于输入中文)
'resetKeyboard': True, # 执行完程序恢复原来的输入法
'newCommandTimeout': 6000,
}
# 连接appium服务器
driver = webdriver.Remote('http://localhost:4723', options=UiAutomator2Options().load_capabilities(capabilities))
# 设置缺省等待时间
driver.implicitly_wait(5)
el = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="电池"]')
el.click()
driver.quit()
提示
- 安卓自带的界面元素查看工具,在sdk/tools/bin目录下:
uiautomatorviewer
- (推荐)appium元素查看工具:Appium Inspector
定位元素的方法
from appium.webdriver.common.appiumby import AppiumBy
from selenium.common.exceptions import NoSuchElementException
# 根据id来定位(在安卓中指的是控件的resource-id属性,请注意在安卓规范要求id唯一,实际上可能不唯一)
element = driver.find_element(AppiumBy.ID, 'xxx')
elements = driver.find_elements(AppiumBy.ID, 'xxx')
# 根据class name来定位(app的class指的是java类名,类似html标签名称)
elements = driver.find_elements(AppiumBy.CLASS_NAME, 'android.widget.TextView')
# 根据accessibility id来定位(在安卓中指的是控件的content-desc属性,类似控件描述)
element = driver.find_element(AppiumBy.ACCESSIBILITY_ID, '搜索')
# 根据xpath来定位(xpath是xml路径,类似css选择器)
element = driver.find_element(AppiumBy.XPATH, "//*[@resource-id='tv.danmaku.bili:id/tabs']//android.widget.FrameLayout[3]")
# 根据安卓UIAutomator源码定位(注意安卓源码的字符串是使用双引号)
# UI Automator官方文档:https://developer.android.google.cn/training/testing/ui-automator
# 查看安装控件及属性:https://developer.android.google.cn/reference/androidx/test/uiautomator/UiSelector
element = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("搜索").className("android.widget.TextView")')
element = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().description("搜索").resourceId("tv.danmaku.bili:id/search_src_text")')
element = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.TextView").textContains("包含关键字")')
UIAutomator源码定位可以根据文本内容text定位,这个是其他方法没有的。