python:调用 ui2 获取当前页面所有实时文本
import uiautomator2 as u2
import xml.etree.ElementTree as ET
# 连接设备
d = u2.connect()
# 获取屏幕的 XML 结构
xml_str = d.dump_hierarchy() # 返回 XML 字符串
# 解析 XML
root = ET.fromstring(xml_str)
# 提取所有 text 属性
all_texts = []
for elem in root.iter():
text = elem.attrib.get("text")
if text and text.strip() != "":
all_texts.append(text.strip())
print("屏幕所有文本:", all_texts)
运行结果
D:\1_Python3.8\python.exe D:\2_PythonProject\Multilingual_comparison\text_extraction2.py
屏幕所有文本: ['推荐', '电影', '电视', '少儿', '歌名', '歌手', '20°', '20°', '75米']
进程已结束,退出代码为 0
常见问题
1. 文本缺失或截断
- 原因:XML 中可能记录完整文本,但屏幕显示因布局限制被截断(如
ellipsize
属性)16。 - 解决:直接通过控件对象获取完整文本:
element = d(textStartsWith="部分文本") full_text = element.get_text()
-
如果希望在获取文本时,同时获取文本的字体、粗细、大小
-
从 XML 属性中提取(部分设备/系统支持)
-
import uiautomator2 as u2 import xml.etree.ElementTree as ET d = u2.connect() #通过 dump_hierarchy() 获取当前屏幕的 XML 结构,确保数据为最新 xml_str = d.dump_hierarchy() # 获取 实时XML 字符串 root = ET.fromstring(xml_str) elements_info = [] for elem in root.iter(): text = elem.attrib.get("text", "").strip() # if text != "": # print(text) if not text: continue # 获取字体大小(单位:sp/dp,需转换) text_size = elem.attrib.get("textSize") # 获取字体样式(bold/italic等) text_style = elem.attrib.get("textStyle", "") # 获取字体名称(通常为系统默认,如 sans-serif、monospace) font_family = elem.attrib.get("fontFamily", "system-default") elements_info.append({ "text": text, "font_size": text_size, "font_weight": "bold" if "bold" in text_style else "normal", "font_family": font_family }) print(elements_info)
运行结果
-
D:\1_Python3.8\python.exe D:\2_PythonProject\Multilingual_comparison\text_extraction2.py [{'text': '推荐', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '电影', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '电视', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '少儿', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '歌名', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '歌手', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '20°', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '20°', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}, {'text': '79米', 'font_size': None, 'font_weight': 'normal', 'font_family': 'system-default'}] 进程已结束,退出代码为 0
-
通过上述方法,可稳定获取 Android 当前页面的实时文本数据,适用于自动化测试、数据采集等场景
-
注意事项
-
XML 属性的局限性
textSize
可能以像素(px)或设备无关像素(dp/sp)为单位,需手动转换。fontFamily
通常只返回系统默认值(如sans-serif
),自定义字体可能无法获取。-
- 通过 Android 的 XML 布局或 UI 层次结构获取的文本内容,可能无法与屏幕实际显示完全一致。以下是可能导致差异的典型场景及原因:
-
一、动态内容修改导致不一致
-
运行时文本更新
XML 中的文本可能是初始值,但代码中通过setText()
动态修改了显示内容(如根据用户输入、网络请求更新文字),此时 XML 结构不会实时同步4。
示例:XML 中定义按钮文本为“提交”,但代码中根据状态改为“已提交”。 -
多语言/资源动态加载
若应用支持多语言,实际显示的文字可能基于当前系统语言动态加载资源文件(如strings.xml
),而 XML 仅记录默认语言的文本4。