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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demons_皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值