Appium 3.x 实战笔记:扒光元素看个够 ------ text、size、location、page_source 获取秘籍(适配 Python Client 5.x)
前言
在自动化测试中,光会点击、输入还不够,你总得知道找到的元素到底"长"什么样吧?它显示了啥文字?宽高多少?藏在屏幕哪个旮旯?甚至整个页面的 XML 结构是啥?
这篇笔记,我就用 Appium 3.x + Appium-Python-Client 5.x 的环境,手把手带你获取元素的 text、size、location 以及全页面的 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 + width、y + 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 一把梭,爽不爽?
五、这些属性到底有什么用?(实战场景)
-
断言文字
pythonassert "流量使用" in el.text, "难道我的流量偷偷跑了?" -
判断元素大小变化
比如点开一个展开菜单,前后
size['height']从 50 变成 200,说明展开了。 -
自动截图时标记位置
用
location和size算出元素中心,再配合PIL画个红框,回归测试对比图一键生成。 -
调试定位神器: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, ...)。- 看一百遍不如亲自踩一次,踩了以后这篇笔记你就珍藏了。
版权与参考说明
- 本文为个人原创学习笔记,所有代码与案例均为实操整理,发布于 CSDN 仅作技术交流;
- Appium 为开源自动化测试框架,遵循 Apache 2.0 开源协议,引用其官方规范仅作学习说明;
- 参考资料:Appium 官方文档。