android - Appium - Xpath 让直接子代不在 Android 上工作
问题描述
出于某种原因,我无法在 Android 上获取元素的所有直接子元素。显然,在元素中搜索子元素时 XPath 无法正常工作,或者 XPath 范围在 Appium 中未正确实现。
parentElement.findElements(By.xpath(...))
我尝试了什么:
*
./*
.//*
.//child::*
./child::*
//*
//child::*
我的结果要么是零,要么是所有节点(甚至在父元素之外),要么是所有子节点。
唯一对我有用的是:
.//*[@resource-id='RESOURCE-ID-OF-PARENT']/child::*
但这是非常糟糕的解决方法,因为可能有多个元素具有相同的资源 ID(仅供参考,我正在编写基于 Appium 的包装器)
我试图在这里搜索所有答案,但找不到任何可行的解决方案。
欢迎任何帮助,谢谢。
解决方案
我找到了某种解决方法:
1) 编写一个比较两个元素的函数。由于提供的 equals 方法不适用于本机元素(Android、iOS),因此必须编写自己的实现。我正在比较最相关的属性,例如类、资源 ID 和内容描述以及大小、位置和边界。这应该在 99% 的情况下有效,除非存在两个相同的重叠元素。
2) 查询具有最准确属性的父元素 ( findElementsByXpath
) 的 xpath - tagName、class、资源 ID 和 contentDescription。大多数情况下,只有一个元素,但如果有更多,请浏览列表并使用基于相等功能的比较。
3)标记列表中元素的索引,每当找到匹配项时,以这种格式运行另一个查询:
(//tagName[@class=... and @resource-id= ...etc...])[index]/child::*
请记住,Xpath 中的索引从 1 开始。结果列表是父元素的实际子元素。
解决方法不是最快的,但总比没有好。
推荐阅读
- openssl - 如何使用 OpenSSL 检查签名文件中的时间戳?
- c++ - 程序崩溃并出现 c0000374
- javascript - 我可以通过单击 html 按钮从 UI 运行量角器 e2e 健全性测试套件吗
- terraform - 'invoke stepfunction' 角色(从 cloudwatch 事件控制台创建)有什么权限?
- java - 在 TableView 中拖动/重新排序列时水平滚动
- github - Github 桌面缓存已删除的本地存储库
- java - org.springframework.web.reactive.function.client.WebClientRequestException:连接被拒绝:/0:0:0:0:0:0:0:1:80;
- python - GCP Dataflow 管道在 DirectRunner 中的运行速度比 DataflowRunner 快
- node.js - fs-extra readFile 不是函数
- java - 增强的 For 循环查询