【问题标题】:How can I get the last element using Xpath in Appium如何在 Appium 中使用 Xpath 获取最后一个元素
【发布时间】:2020-03-28 09:51:33
【问题描述】:
例如,我的 Android 应用中有消息元素,它们都有一个名为 "message_view" 的 resource-id。
我想要的是仅使用 Xpath 获取带有此资源 ID 的最后一条消息。我尝试使用[last()],但它不起作用:
driver.findElement (By.xpath ("//*[contains(@resource-id,'message_view')][last()]"));
我知道我可以使用findElements(),然后是.get(list.size() - 1)。但我想了解如何仅使用 Xpath 来做到这一点。
【问题讨论】:
标签:
java
android
xpath
automation
appium
【解决方案1】:
在 Xpaths 中,[] 的优先级高于 //,因此在给定的 Xpath 中,last() 不起作用,因为它首先执行而不是最后执行。使用一对括号来强制它按预期工作:
(//*[contains(@resource-id,'message_view')])[last()]
【解决方案2】:
您需要用() 包装定位器,正如另一个答案中提到的那样。
我将解释//locator[last()]和(//locator)[last()]之间的区别
假设你有以下 DOM:
<div>
<div>
<p1></p1> // 1
<p1></p1> // 2
</div>
<div>
<p1></p1> // 3
<p1></p1> // 4
</div>
</div>
使用//p1[last()],您会找到所有 p1 元素,它们是其节点中的最后一个元素(兄弟姐妹的最后一个),因此它是第 2 个和第 4 个 p1 元素。
通过(//locator)[last()] 定位器,您将找到所有 p1 节点,然后选择最后一个(实际上是 DOM 中的最后一个 p1 节点),因此它是第 4 个 p1 元素。