我正在为一个iOS应用程序进行自动化测试。我在MacOS (10.15)上使用Appium桌面客户机(1.15.1),并通过检查器在iPhone11 (13.3)上找到一个元素,其属性如下:
目标是使用appium (6.1.0)和selenium (3.13.0)在java中执行以下操作:
通过elementId
查找该元素并获取变量值(在本例中为2,6公里)。
问题到达了元素。在检查器中,accessibility-id
和name
总是等于值,这意味着我不能用它们来本地化元素。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的部分找到元素,然后才能读出值。
发布于 2020-03-24 03:04:20
我会尝试这个安全的选择:
//*[local-name(@*)="@elementId"][starts-with(normalize-space(string(@*)),"45000000-0000-0000")]
因为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')]
https://stackoverflow.com/questions/60829360
复制