自动化测试之appium API
1、Desired Capabilities
appium 在启动 session 时,需要提供 Desired Capabilities。Desired Capabilities 本质上是字典对象,由客户端生成并发送给服务器(appium Desktop),告诉服务器 App 运行的环境。
from appium import webdriver # 定义 Android 运行环境 desired_caps = { 'deviceName': 'Android Emulator', 'automationName': 'appium', 'platformName': 'Android', 'platformVersion': '7.0', 'appPackage': 'com.android.calculator2', 'appActivity': '.Calculator', 'noReset': True, } driver = webdriver.Remote(command_executor='http://localhost:4723/wd/hub',desired_capabilities=desired_caps) …
1. deviceName:启动的设备、真机或模拟器,如 iPhone Simulator、Android Emulator、Galaxy S4 等。
2. automationName:使用的自动化引擎,如 appium(默认)或 Selendroid(兼容 AndroidAPI 17 以下)。
3. platformName:使用的移动平台,如 iOS 或 Android。
4. platformVersion:指定平台的系统版本,如 Android 平台,版本为 7.0。
5. appPackage:被测试 App 的 Package 名,如 com.example.android.myApp、com.android.settings 等。
6. appActivity:被测试 App 的 Activity 名,如 Calculator、MainActivity、.Settings 等。
7. noReset:在会话前重置应用状态。当设置为 True 时,会跳过安装指引;默认为false。
appium 在启动 App 时必须要设置 appPackage 和 appActivity 两个参数。
方式一:通过 adb 工具抓取日志进行分析。
(1)运行“adb logcat>D:/log.txt”命令,将 adb 抓取的日志写入 D:/log.txt 文件。
(2)在 Android 模拟器或设备中打开要测试的 App,并做一些操作。
(3)按快捷键 Ctrl+c 结束日志的捕捉。
(4)打开 D:/log.txt 文件,搜索“Displayed”关键字,查找 App 的 Package 和 Activity。
aapt 即 Android Asset Packaging Tool,在 SDK 的 build-tools 目录下。该工具既可以查看、创建、更新 zip 格式的文档附件(zip、jar、apk),也可以将资源文件编译成二进制文件。
2、控件定位
可以借助 Android SDK 自带的 UI Automator Viewer 工具对 Android 设备式模拟器中的控件进行定位。该工具位于…\tools\bin\目录下的 uiautomatorviewer.bat 文件中可以双击启动,也可以在 Windows 命令提示符下输入“uiautomatorviewer”命令启动。
1. id 定位
id 定位是使用控件的 resource-id 进行定位的。
driver.find_element_by_id()
2. Class Name 定位
Class Name 定位是使用控件的 class 属性进行定位的。
driver.find_elements_by_class_name()
3. XPath 定位
根据 WebDriver 上的 XPath 使用经验,查找层级标签名是错误的,正确的方式是获取控件的 class 属性,来代替标签名。
driver.find_element_by_xpath("//android.view.ViewGroup/android.widget.Button")
4. Accessibility id 定位
driver.find_element_by_accessibility_id("plus")
5. Android uiautomator 定位
该方法属于 appium 的扩展定位方法,并且只支持 Android 平台。一个元素的任意属性都可以通过 Android uiautomator 方法来进行定位,使用方法如下。
# text 属性 driver.find_element_by_android_uiautomator('new UiSelector().text("clr")') # content-desc 属性 driver.find_element_by_android_uiautomator('new UiSelector().description("equals")') # id 属性 driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/digit_1")') # class 属性 driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")')
6. 其他定位
driver.find_element_by_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_css_selector()
driver.find_element_by_ios_uiautomation()
driver.find_element_by_ios_predicate()
driver.find_element_by_ios_class_chain()
driver.find_element_by_android_viewtag()
find_element_by_android_data_matcher()
driver.find_element_by_image()
driver.find_element_by_custom()
3、appium 的常用 API
1. 应用操作
install_app()
driver.install_app("D:\\android\\apk\\ContactManager.apk")
remove_app()
driver.remove_app('com.example.android.apis')
close_app()
launch_app()
is_app_installed()
result = driver.is_app_installed('com.example.android.apis') print(result)
background_app()
reset()
2. 上下文操作
driver.contexts
driver.current_context
switch_to.context()
3. 键盘操作
send_keys()
keyevent()
4. 触摸操作
(1)单击控件
tap(self, element=None, x=None, y=None, count=1)
long_press(self, el=None, x=None, y=None, duration=1000)
move_to(self, el=None, x=None, y=None)
wait(self, ms=0)
from appium.webdriver.common.multi_action import MultiAction from appium.webdriver.common.touch_action import TouchAction … # 执行动作链 els = driver.find_elements_by_class_name('listView') a1 = TouchAction() a1.press(els[0])\ .move_to(x=10, y=0)\ .move_to(x=10, y=-75)\ .move_to(x=10, y=-600)\ .release() a2 = TouchAction() a2.press(els[1]) \ .move_to(x=10, y=10)\ .move_to(x=10, y=-300)\ .move_to(x=10, y=-600)\ .release() ma = MultiAction(driver, els[0]) ma.add(a1, a2) ma.perform()
5. 特有操作
(1)熄屏
lock(self, seconds=None)
(2)获取当前 package
获取当前 App 的包名(package),仅支持 Android。
package = driver.current_package print(package)
(3)获取当前 activity
获取当前 App 的 activity,仅支持 Android。
activity = driver.current_activity print(activity)
driver.hide_keyboard() # 收起虚拟键盘
(5)获取屏幕宽高
当需要通过坐标(x,y)对屏幕进行操作时,就需要获取屏幕的宽高。
windows = driver.get_window_size() print(windows["width"]) print(windows["height"])
(6)拉取文件
从真机或模拟器中拉取文件。path 参数指定文件的路径。
pull_file(self, path)
push_file(self, path, base64data)
data = "some data for the file" path = "/data/local/tmp/file.txt" driver.push_file(path, data.encode('base64'))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)