Appium 3.x实战:获取元素属性全解析

Appium 3.x 实战笔记:扒光元素看个够 ------ text、size、location、page_source 获取秘籍(适配 Python Client 5.x)

前言

在自动化测试中,光会点击、输入还不够,你总得知道找到的元素到底"长"什么样吧?它显示了啥文字?宽高多少?藏在屏幕哪个旮旯?甚至整个页面的 XML 结构是啥?

这篇笔记,我就用 Appium 3.x + Appium-Python-Client 5.x 的环境,手把手带你获取元素的 textsizelocation 以及全页面的 page_source。老规矩,雷电9(安卓9)实操验证,代码复制即用,配合全程风趣讲解,保你一看就懂,忘了还能当速查表。

本文为个人原创学习笔记,发布于 CSDN 仅作技术交流;Appium 遵循 Apache 2.0 开源协议。


一、这次我们要扒什么?

属性 含义 能干啥?
text 元素上显示的文字 断言页面内容是否正确
size 元素的宽和高(单位:像素) 验证控件尺寸、判断是否可点击
location 元素左上角的坐标 {x, y} 辅助坐标点击、滑动计算
page_source 当前页面的完整 XML 结构 调试定位、快速查找层级关系

一句话总结:text 看字,size 看块,location 看位置,page_source 看全家。


二、核心语法(新版必用)

python 复制代码
from appium.webdriver.common.appiumby import By

# 定位一个元素(新版统一写法)
el = driver.find_element(By.XPATH, "//*[@text='WLAN、移动网络、流量使用']")

# 扒信息
print(el.text)       # 输出元素文字
print(el.size)       # 输出字典 {'height': 29, 'width': 296}
print(el.location)   # 输出字典 {'x': 108, 'y': 236}

# 打印整个页面的源码
print(driver.page_source)

老版本 可能用过 el.get_attribute("text") 之类的,但在 5.x 中,直接用属性 el.text 最香,简单又 Pythonic。


三、完整示例代码(复制即用)

python 复制代码
import time
from appium import webdriver
from appium.options.common import AppiumOptions
from appium.webdriver.common.appiumby import By

# 连接设置
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,
}

options = AppiumOptions()
options.load_capabilities(caps)
driver = webdriver.Remote("http://127.0.0.1:4723", options=options)

# 定位"网络和互联网"下面的小字"WLAN、移动网络、流量使用"
el = driver.find_element(By.XPATH, "//*[@text='WLAN、移动网络、流量使用']")

print("===== 扒开看看 =====")
print("文字内容:", el.text)
print("尺寸大小:", el.size)      # 宽 x 高
print("所在位置:", el.location)  # 左上角坐标
print("===== 全家福 =====")
print(driver.page_source)        # 整个页面的 XML

# 等待3秒,关闭APP
time.sleep(3)
driver.execute_script("mobile: terminateApp", {"appId": "com.android.settings"})
driver.quit()

四、运行结果 & 解读(笑点满满版)

1. 文字内容

复制代码
文字内容: WLAN、移动网络、流量使用

妥妥的,就是我们定位的那个辅助说明。如果打印出来是空字符串?那多半是元素没有 text 属性(比如 ImageView、容器),别慌。

2. 尺寸大小

复制代码
尺寸大小: {'height': 29, 'width': 296}

单位是像素。这个元素高 29px,宽 296px。知道了宽高,我们就可以判断控件是否被遮挡,或者变没变形。比如常见的"按钮居然只有 1px 高",那肯定是渲染飞了。

3. 所在位置

复制代码
所在位置: {'x': 108, 'y': 236}

这个坐标是元素左上角 距离屏幕左上角的位置。

x=108 表示离左边缘 108px,y=236 离上边缘 236px。

以后想用 TouchAction 去点某个元素的右下角?那就用 x + widthy + height 算出来。

4. page_source(节选)

复制代码
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy index="0" class="hierarchy" rotation="0" width="1600" height="900">
  <android.widget.FrameLayout ...>
    <android.widget.LinearLayout ...>
      ...
      <android.widget.TextView 
          text="WLAN、移动网络、流量使用" 
          resource-id="android:id/summary" 
          bounds="[108,236][404,265]" ... />
      ...
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>

别被它吓到 ,这其实就是 Appium 看到的 UI 树。你以后定位元素时写的 XPath,就是在这棵树里玩捉迷藏。

当你在 Inspector 里点来点去拿不到 resource-id 的时候,把这个打印出来 Ctrl+F 一把梭,爽不爽?


五、这些属性到底有什么用?(实战场景)

  1. 断言文字

    python 复制代码
    assert "流量使用" in el.text, "难道我的流量偷偷跑了?"
  2. 判断元素大小变化

    比如点开一个展开菜单,前后 size['height'] 从 50 变成 200,说明展开了。

  3. 自动截图时标记位置

    locationsize 算出元素中心,再配合 PIL 画个红框,回归测试对比图一键生成。

  4. 调试定位神器:page_source

    定位不到元素时,把源码存成 .xml 文件,扔到浏览器里看层级,或者直接复制节点文本写 XPath,比 Inspector 还直观。


六、新手避坑 & 幽默总结

🐳 坑1:text 为空

  • 如果你拿到的 text'',先看看元素是不是 EditText 或者 ImageView,它们压根就没有 text 属性。
  • 正确做法:先去 Inspector 看一眼,别逮着一个 ImageView 就问人家"你叫什么名字"。

🐳 坑2:size 和 location 单位别搞混

  • 单位是像素(px),不是 dp,也不是你屏幕的物理尺寸。你可以在脚本里根据屏幕密度转换,但绝大多数时候像素够用了。

🐳 坑3:page_source 爆炸输出

  • 像系统设置的页面 XML 还算克制,你要是打开一个复杂 APP(比如朋友圈),那个 page_source 打印出来能让 PyCharm 卡半分钟。
  • 强烈建议只打印关键部分:print(driver.page_source[:500]) 或者存文件再查。

🐳 坑4:老方法已凉

  • driver.find_element_by_xpath() 这种写了只会送你一个 AttributeError,必须用 find_element(By.XPATH, ...)
  • 看一百遍不如亲自踩一次,踩了以后这篇笔记你就珍藏了。

版权与参考说明

  1. 本文为个人原创学习笔记,所有代码与案例均为实操整理,发布于 CSDN 仅作技术交流;
  2. Appium 为开源自动化测试框架,遵循 Apache 2.0 开源协议,引用其官方规范仅作学习说明;
  3. 参考资料:Appium 官方文档

相关推荐
宠友信息16 小时前
消息序号如何保证即时通讯源码聊天记录稳定加载
java·spring boot·redis·python·mysql·uni-app
zhou lily16 小时前
超自动化落地:RPA+AI如何打通业务流程的“最后一公里”?
人工智能·自动化·rpa
小柯南敲键盘16 小时前
批量图片翻译与视频字幕一站式解决高效跨境电商沟通难题
大数据·人工智能·python·音视频
smj2302_7968265218 小时前
解决leetcode第3989题网格中保持一致的最大列数
python·算法·leetcode
吴梓穆19 小时前
Python 基础 正则表达式
python
巧克力男孩dd19 小时前
Python超典型练习题(第一次作业)
开发语言·python·算法
闲猫20 小时前
LangChain / Core components / Models
开发语言·python·langchain
梦想的旅途21 天前
JavaScript 实现企业微信消息自动发送的技术实践
运维·javascript·自动化·企业微信