当前位置: 首页 > news >正文

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。

相关文章:

  • 数据结构——优先级队列(堆)
  • 复习HCIA
  • 解决用three.js展示n个叠加的stl模型文件错位的问题
  • ubuntu qt工程打包后续:桌面快捷方式、开机登陆桌面后自动运行
  • OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()
  • 在线JSON格式校验工具站
  • 详细介绍IDI_APPLICATION和IDC_ARROW
  • ubuntu20.04使用matlab2024a快捷键调整
  • Python 爬取 1688 关键词搜索接口数据返回说明
  • vue el-table 设置selection选中状态
  • MySql面试总结(三)
  • matlab近似计算联合密度分布
  • 阿里云国际站代理商:如何构建交互式安全分析看板?
  • vue3+el-cascader-panel+多选+动态加载+默认展开+选中查询节点并展开+查询到的这一条自动滚动到顶部+tooltip效果
  • 高铁监控存储扩容-DS SAN存储磁盘阵列
  • Python中数据结构元组详解
  • LangChain开发(一)介绍和第一个例子
  • 什么是 BA ?BA怎么样?BA和BI是什么关系?
  • Nginx的HTTPS配置
  • 【论文笔记】Transformer
  • 云南威信麟凤镇通报“有人穿‘警察’字样雨衣参与丧事”:已立案查处
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式
  • 多家中小银行存款利率迈入“1时代”
  • 水豚“豆包”出逃已40天,扬州茱萸湾景区追加悬赏
  • 季子文化与江南文化的根脉探寻与融合
  • 普京提议无条件重启俄乌谈判,外交部:我们支持一切致力于和平的努力