Appium:使用 XPath 通过部分 elementId/UID 查找元素

Posted

技术标签:

【中文标题】Appium:使用 XPath 通过部分 elementId/UID 查找元素【英文标题】:Appium: Find element by partial elementId/UID with XPath 【发布时间】:2020-07-04 20:22:24 【问题描述】:

我正在为 ios 应用程序进行测试自动化。 我在 MacOS (10.15) 上使用 Appium-desktop-client (1.15.1) 并通过 Inspector 在 Iphone 11 (13.3) 上找到具有以下属性的元素: screenshot from the attributes

目标是在 java 中使用 appium (6.1.0) 和 selenium (3.13.0) 执行以下操作:

通过elementId 找到该元素并获取变量值(在本例中为 2.6 公里)。

问题正在触及元素。在 Inspector 中,accessibility-idname 始终等于该值,这意味着我无法使用它们本地化元素。 elementId 不是固定的,它在第三个数字块之后变化(这意味着我只能使用 45000000-0000-0000。)我也可以使用 "UID" 中的代码从 Inspector 复制这个 elementId属性。

为了本地化元素,我尝试了以下方法:

appiumDriver.findElementByXPath("//*[contains(@id,'45000000-0000-0000')]");

appiumDriver.findElementByXPath("//*[contains(@name,'45000000-0000-0000')]");

appiumDriver.findElementByXPath("//*[contains(@uid,'45000000-0000-0000')]");

appiumDriver.findElementByXPath("//*[contains(@elementId,'45000000-0000-0000')]");

appiumDriver.findElementByXPath("//*[contains(@RuntimeId,'45000000-0000-0000')]");

appiumDriver.findElementByXPath("//*[contains(@ProcessId,'45000000-0000-0000')]");

appiumDriver.findElementByXPath("//*[contains(@class,'45000000-0000-0000')]");

然而,在所有这些定位元素的尝试中,出现了org.openqa.selenium.NoSuchElementException

我的问题现在是,我必须在xpath 中写什么才能通过 Inspector 中的 elementId 部分(或属性 UID)找到元素,然后才能读出值。

【问题讨论】:

【参考方案1】:

我会尝试这个安全选项:

//*[local-name(@*)="@elementId"][starts-with(normalize-space(string(@*)),"45000000-0000-0000")]

EDIT : contains 选项不起作用,因为 elementId 不是元素的第一个属性。

你可以试试:

//*[@*="45000000"]

如果这不起作用,让我们用暴力破解:

//*[contains(@*[2],'45000000')]
//*[contains(@*[3],'45000000')]
//*[contains(@*[4],'45000000')]
//*[contains(@*[5],'45000000')]
//*[contains(@*[6],'45000000')]
//*[contains(@*[7],'45000000')]
//*[contains(@*[8],'45000000')]
//*[contains(@*[9],'45000000')]
//*[contains(@*[10],'45000000')]
//*[contains(@*[11],'45000000')]

【讨论】:

这对我不起作用。当我运行“//* [包含(@name,'2,6')]”时,它会找到元素(但这对我没有用)。如果我将这两个值添加到您的代码中,它也不会找到该元素。但是是否有可能做一些类似“//* [包含(@*,'45000000-0000-0000')]”的事情来查看元素是否可以访问? 是的。但是您必须更正您的 XPath://*[contains(@*, '45000000-0000-0000')]。缩写形式://*[contains(@*, '45000000')] 它没有找到元素,但如果我想用“//*[contains(@*, '2,6 km')]”验证@*(与名称匹配或可访问性ID)它也找不到任何元素。看来,这不是 XPath 的有效参数。

以上是关于Appium:使用 XPath 通过部分 elementId/UID 查找元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 appium 在移动应用中查找 xpath

Appium依据xpath获取控件实例随笔

Appium根据xpath获取控件实例随笔

如何通过移动 xpath 与 Appium 匹配 @text 属性和正则表达式(正则表达式)来查找元素?

Appium《元素定位和UiAutomator表达式》

四:RF框架appium工具之xpath定位