Appium 3.x实战:批量定位元素新写法详解

发布时间:2026/7/18 20:16:48
Appium 3.x实战:批量定位元素新写法详解 Appium 3.x 实战笔记定位一组元素find_elements新版写法与示例适配Python Client 5.x前言本文为Appium移动端自动化学习笔记针对Appium 3.x Appium-Python-Client 5.x版本梳理如何一次性定位多个元素的标准写法。在自动化测试中经常需要获取某一类元素如列表项、同一ID的控件集合并批量操作。老版本客户端中driver.find_elements_by_id()等写法已被彻底移除新版统一使用driver.find_elements(By.XXX, 定位值)。本文以系统设置APP为例演示三种常用定位方式ID、CLASS、XPATH获取一组元素并打印其文字所有代码均基于雷电9安卓9环境实操验证适合新手快速掌握。本文为个人原创学习笔记发布于CSDN仅作技术交流Appium遵循Apache 2.0开源协议。一、定位一组元素的核心语法功能说明find_elements返回所有符合条件的元素列表类型为list。与find_element不同的是find_element找不到元素会直接抛出NoSuchElementException异常。find_elements找不到匹配元素时返回空列表不会报错程序可安全继续执行。新版正确写法fromappium.webdriver.common.appiumbyimportBy# 统一格式注意是 find_elements多了个 s元素列表driver.find_elements(By.XXX,定位值)常用定位方式速查定位方式By 常量示例通过ID批量定位By.IDdriver.find_elements(By.ID, com.android.settings:id/title)通过CLASS批量定位By.CLASS_NAMEdriver.find_elements(By.CLASS_NAME, android.widget.TextView)通过XPATH批量定位By.XPATHdriver.find_elements(By.XPATH, //*[contains(text,设)])二、完整示例代码批量获取文字以下代码打开系统设置分别使用ID、CLASS、XPATH三种方式定位一组元素并将每个元素的文字内容打印出来最后关闭APP。importtimefromappiumimportwebdriverfromappium.options.commonimportAppiumOptionsfromappium.webdriver.common.appiumbyimportBy# 配置参数caps{platformName:Android,appium:platformVersion:9,appium:deviceName:25102RKBEC,appium:automationName:UiAutomator2,appium:appPackage:com.android.settings,appium:appActivity:com.android.settings.Settings,appium:noReset:True,}# 创建驱动连接AppiumoptionsAppiumOptions()options.load_capabilities(caps)driverwebdriver.Remote(http://127.0.0.1:4723,optionsoptions)# ① 使用ID定位获取所有 resource-id 为 android:id/title 的元素并打印其文字forelemindriver.find_elements(By.ID,android:id/title):print(elem.text)print(_______*_______)# ② 使用CLASS定位获取所有 class 为 android.widget.TextView 的元素并打印其文字forelemindriver.find_elements(By.CLASS_NAME,android.widget.TextView):print(elem.text)print(_______*_______)# ③ 使用XPATH定位获取所有 text 包含 设 的元素并打印其文字forelemindriver.find_elements(By.XPATH,//*[contains(text,设)]):print(elem.text)print(_______*_______)# ④ 等待3秒关闭APPtime.sleep(3)driver.execute_script(mobile: terminateApp,{appId:com.android.settings})driver.quit()输出结果示例雷电9系统设置首页网络和互联网 已连接的设备 应用和通知 电池 显示 声音 存储 ... _______*_______ 设置 在设置中搜索 网络和互联网 WLAN、移动网络、流量使用 已连接的设备 蓝牙 应用和通知 权限、默认应用 电池 100% 显示 壁纸、休眠、字体大小 声音 音量、振动、勿扰 存储 已使用 27% - 还剩 23.32 GB _______*_______ 设置 在设置中搜索观察输出可知ID定位到的通常是主要菜单项标题CLASS定位出的范围更广包含所有TextViewXPATH定位出所有包含“设”字的元素如“设置”“在设置中搜索”。三、新旧API对照表复习速查老版本直接写法已失效新版标准写法备注driver.find_elements_by_id(xxx)driver.find_elements(By.ID, xxx)批量ID定位driver.find_elements_by_accessibility_id(xxx)driver.find_elements(By.ACCESSIBILITY_ID, xxx)批量无障碍描述定位driver.find_elements_by_class_name(xxx)driver.find_elements(By.CLASS_NAME, xxx)批量类名定位driver.find_elements_by_xpath(xxx)driver.find_elements(By.XPATH, xxx)批量XPath定位核心变化所有find_elements_by_前缀的方法已被移除必须改为find_elements(By.XXX, 值)注意find_elements后面的s不可省略。四、新手避坑总结区分 find_element 与 find_elements找单个元素用find_element返回单个元素对象找不到则直接报错。找一组元素用find_elements返回列表找不到返回空列表不会报错。千万不要把find_element当成返回多个元素用否则只会返回第一个。列表为空时的处理遍历前最好判断长度避免对空列表做无用操作elemsdriver.find_elements(By.ID,某个ID)ifelems:foreinelems:print(e.text)else:print(未找到任何元素)text属性可能为空某些元素虽然定位到了但若没有显示文字例如图片、容器text属性会返回空字符串。打印时不会报错但结果可能不是你想要的需在逻辑中加以区分。ID定位注意资源前缀安卓系统元素的ID通常以android:id/开头应用自身元素则带包名如com.android.settings:id/。使用find_elements(By.ID, android:id/title)可以跨应用抓取系统标题但要注意作用域。建议优先使用完整的resource-id以提升精确度。XPath contains 是批量匹配的利器当元素 text 并不完全固定时可以用contains(text, 关键字)模糊匹配这在多语言或动态文本场景中非常实用。五、练习与扩展掌握了单个元素与一组元素的定位后可以尝试以下练习获取当前页面所有可点击元素的 text并存到列表。批量点击某一类按钮如所有开关控件实现批量设置。结合WebDriverWait等待一组元素出现后再进行操作。版权与参考说明本文为个人原创学习笔记所有代码与案例均为实操整理发布于CSDN仅作技术交流Appium 为开源自动化测试框架遵循 Apache 2.0 开源协议引用其官方规范仅作学习说明参考资料Appium 官方文档。