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

时间:2020-03-24 10:37:55

标签: java selenium xpath appium appium-ios

我正在为iOS应用程序进行自动化测试。 我在MacOS(10.15)上使用Appium桌面客户端(1.15.1),并通过Inspector在Iphone 11(13.3)上找到了具有以下属性的元素: screenshot from the attributes

目标将在Java中使用鸦片(6.1.0)和硒(3.13.0)进行以下操作:

通过elementId查找此元素并获取变量值(在本例中为2.6 km)。

问题已到达要素。在检查器中,accessibility-idname始终等于值,这意味着我无法使用它们来定位元素。 elementId不是固定的,它在第三个数字块之后变化(这意味着我只能使用45000000-0000-0000。)我还可以使用以下代码从检查器中重现此elementId"UID"属性。

要对元素进行本地化,我尝试了以下操作:

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中写什么才能通过检查器(或属性UID)中的elementId部分找到元素,然后能够读出该值。

1 个答案:

答案 0 :(得分:0)

我会尝试使用此安全选项:

//*[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')]