You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ruby从指定XML中提取checkmark前的Default文本?

问题描述

我在处理一段XCUI结构的XML,已通过以下Ruby代码从更大的XML中提取出包含checkmark按钮的XCUIElementTypeCell节点:

xml = $D[device].page_source
doc = Nokogiri::XML(xml)
res = doc.xpath('//*[@name="checkmark"]').first.parent

对应的XML片段如下:

<XCUIElementTypeCell type="XCUIElementTypeCell" enabled="true" visible="true" x="0" y="165" width="320" height="40">
    <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="165" width="320" height="1">
    </XCUIElementTypeOther>
    <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="165" width="320" height="40">
      <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="165" width="320" height="40">
      </XCUIElementTypeOther>
    </XCUIElementTypeOther>
    <XCUIElementTypeStaticText type="XCUIElementTypeStaticText" enabled="true" visible="true" x="16" y="165" width="258" height="40" name="Default" label="Default" value="Default">
    </XCUIElementTypeStaticText>
    <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="16" y="203" width="304" height="2">
    </XCUIElementTypeOther>
    <XCUIElementTypeButton type="XCUIElementTypeButton" enabled="false" visible="true" x="284" y="176" width="18" height="17" name="checkmark" label="checkmark">
    </XCUIElementTypeButton>
  </XCUIElementTypeCell>

我的目标是获取checkmark按钮之前的文本内容(即XML中的"Default"),但无法通过代码实现,请求技术帮助。

解决方案

方法1:从已提取的Cell节点直接定位StaticText

目标文本存储在XCUIElementTypeStaticText节点的name/label/value属性中,可直接从Cell节点查询该类型节点:

# 从已获取的Cell节点中查找StaticText节点
static_text_node = res.at_xpath('.//XCUIElementTypeStaticText')
# 获取属性值,三个属性均为"Default",任选其一即可
text = static_text_node['name']
# 也可使用label或value属性
# text = static_text_node['label']
# text = static_text_node['value']
puts text # 输出: Default

方法2:通过checkmark节点反向查找前置StaticText

如果需要严格基于checkmark节点的位置,查找其同一父节点下的前置StaticText:

# 定位checkmark节点
checkmark_node = doc.xpath('//*[@name="checkmark"]').first
# 查找该节点之前的所有StaticText节点,取最后一个(即最近的前置节点)
static_text_node = checkmark_node.xpath('./preceding-sibling::XCUIElementTypeStaticText').last
text = static_text_node['name']
puts text # 输出: Default

方法3:一步到位的XPath查询

无需先提取Cell节点,直接用XPath语句获取目标文本:

# 直接获取checkmark节点父节点下StaticText的name属性值
text = doc.xpath('//*[@name="checkmark"]/../XCUIElementTypeStaticText/@name').text
puts text # 输出: Default

内容的提问来源于stack exchange,提问作者eva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:47:25