如何用Appium+Python控制Android设备?含iOS适配及脚本需求
无需推送APK/IPA,用Appium控制Android/iOS设备的Python方案
嘿,我完全懂你的需求——不想每次都推送新的APK,直接用Appium控制Android设备上已有的应用甚至系统界面,靠resource id、class这些原生控件定位方式来操作,对吧?这完全可以实现,而且iOS端也有类似的玩法,下面给你一步步讲清楚,再附上实用的Python脚本示例。
一、Android端实现核心要点
首先你要知道:Appium并不是必须推送APK才能工作的。你不需要在desired capabilities里指定app参数(这个参数才是用来推送APK的),反而可以用appPackage和appActivity直接指定设备上已经安装好的应用——不管是系统自带的(比如设置、电话),还是用户自己装的第三方APP都没问题。
Appium的UIAutomator2驱动本身就原生支持通过resource-id、className、xpath这些方式定位Android控件,逻辑和你做应用测试时的定位完全一致,只是跳过了推送APK的步骤而已。
前置准备
- 确保Android设备开启USB调试,并正常连接到电脑
- 启动Appium服务(可以用命令行敲
appium启动,或者用Appium Desktop可视化工具) - 提前获取目标应用的
appPackage和appActivity:可以用adb shell dumpsys window | grep mCurrentFocus命令查看当前前台应用的信息,或者直接用Appium Inspector可视化获取。
二、iOS端实现核心要点
iOS端逻辑和Android基本一致:不需要推送IPA,而是通过指定应用的bundleId来直接启动设备上已安装的应用(包括系统APP和第三方APP)。Appium的XCUITest驱动支持用accessibility id、className、xpath来定位iOS控件,操作逻辑和Android端互通。
前置准备
- iOS设备开启开发者模式,并在设备上信任你的电脑
- 确保Appium能正常初始化XCUITest驱动(第一次运行时,可能需要手动在设备上授权WebDriverAgent的权限)
- 获取目标应用的
bundleId:可以通过Xcode查看,或者用Appium Inspector直接抓取。
三、Python脚本示例
Android示例:操作系统设置
这个脚本会打开系统设置,定位到「网络和互联网」选项并点击:
from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy import time # Android Desired Capabilities配置 desired_caps = { "platformName": "Android", "deviceName": "你的设备名称(比如Pixel 7)", "automationName": "UiAutomator2", # 指定已安装的系统设置APP的包名和启动Activity "appPackage": "com.android.settings", "appActivity": ".Settings" } # 连接本地Appium服务 driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps) try: # 等待页面加载,用resource-id定位「网络和互联网」选项 network_option = driver.find_element(AppiumBy.ID, "com.android.settings:id/title") network_option.click() # 停留3秒查看操作效果 time.sleep(3) finally: # 退出驱动,释放资源 driver.quit()
iOS示例:操作系统设置
这个脚本会打开iOS设置,定位到「Wi-Fi」选项并点击:
from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy import time # iOS Desired Capabilities配置 desired_caps = { "platformName": "iOS", "deviceName": "你的iOS设备名称(比如iPhone 14)", "automationName": "XCUITest", # 指定iOS设置APP的bundleId "bundleId": "com.apple.Preferences" } # 连接本地Appium服务 driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps) try: # 等待页面加载,用accessibility id定位「Wi-Fi」选项 wifi_option = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Wi-Fi") wifi_option.click() # 停留3秒查看操作效果 time.sleep(3) finally: # 退出驱动,释放资源 driver.quit()
额外实用提示
- 推荐用Appium Inspector来可视化获取控件的定位信息(比如
resource-id、accessibility id),比手动查包名/Activity效率高太多 - Android上如果要操作系统级控件(比如通知栏、状态栏),可以用Appium内置的API,比如
driver.open_notifications()直接打开通知栏 - iOS上的系统级操作可以用
driver.execute_script('mobile: pressButton', {'name': 'home'})这类脚本模拟物理按键
内容的提问来源于stack exchange,提问作者Mayank Shivhare




