如何用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
相关产品推荐
相关产品推荐

