Java 处理动态ID。如何准确地单击此xpath的第三个突出显示?

Java 处理动态ID。如何准确地单击此xpath的第三个突出显示?,java,selenium,firefox,webdriver,sapui5,Java,Selenium,Firefox,Webdriver,Sapui5,我有一个SAPUI页面,我正在使用SeleniumWebDriver为自动化测试框架导航 在流程中有一个点,我遇到了click,它实际上有3个类似的xpath 问题在于id是动态的,除了aria posinset和文本之外,其他所有内容也是动态的。我无法使用id来单击它。此外,我仍然无法使用下面的xpath来单击它。它只是说元素是不可点击的。当我使用ChromeDeveloper工具使用:hover来查找xpath时,下面的第三个突出显示就是在单击时实际悬停的那个。因此,我想使用xpath的第三

我有一个SAPUI页面,我正在使用SeleniumWebDriver为自动化测试框架导航

在流程中有一个点,我遇到了click,它实际上有3个类似的xpath

问题在于id是动态的,除了aria posinset和文本之外,其他所有内容也是动态的。我无法使用id来单击它。此外,我仍然无法使用下面的xpath来单击它。它只是说元素是不可点击的。当我使用ChromeDeveloper工具使用:hover来查找xpath时,下面的第三个突出显示就是在单击时实际悬停的那个。因此,我想使用xpath的第三个亮点。你们能帮帮我吗

这就是所讨论的xpath:

//a[@aria-posinset='3' and contains(text(),'Quotes')]
以下是使用相同xpath的Chrome开发者工具的3个亮点

1:

现在我得到了这个错误:

Element <a id="navigationitemu3p1aB5MBqswlRFv6wRSym_91" class="sapUiUx3NavBarItem" href="#"> is not clickable at point (902.2166519165039,67.25833129882812) because another element <div id="sapClientBusyIndicatorMobileContainer" class="sapClientBusyIndicatorMobileContainer"> obscures it
元素在点(902.2166519165039,67.25833129882812)处不可单击,因为另一个元素遮挡了它
根据您共享的HTML,很难构造正确的答案,因为所有3个元素都具有类似的属性,而不是
id
数据sap ui
属性的最后部分

如果预期链接始终显示为3rd元素,则可以首先识别父节点并采用以下定位策略:


注意:用正确的
标记名[attribute='value']
替换
父标记
,尝试使用此标记名,它将单击网页上的第三个元素

Xpath:
(//a[@aria posinset='3'和contains(text(),'Quotes'))[3]

完整代码:

driver.findElement(By.xpath("(//a[@aria-posinset='3' and contains(text(),'Quotes')])[3]")).click();
如果上面的代码不起作用,请尝试下面的代码:

driver.findElement(By.xpath("(//a[@aria-posinset='3' and contains(text(),'Quotes')])[3]")).click();

如果我没有弄错,您的第一个和第二个
标签是相同的,这与预期不符。你能重新看一下吗?我已经换了。你有例外吗?还是找到了错误的元素?此xpath适用于我
xpath=//a[text()='Quotes'][3]
。它无法单击xpath定义的元素。我没有像你说的那样使用[3]。因此,根据语法,我应该在末尾添加一个[3]吗?因为当我在xpath中使用[3]时,就像在最初的文章中一样,它不起作用。我假设这是某个更大的表的一部分,等等。您可能需要根据其他元素包含的文本单击引号链接,例如,这些是事物A、事物B的引号链接,而Thing C,你想点击Thing C旁边的Quotes链接。为第三个链接发布一些周围的HTML,并告诉我们第三个链接是什么让你想点击它,也就是说,它在文本Thing C或其他任何东西的旁边。OP已经发布了返回三个元素的XPath。这个答案又增加了什么?他已经说过,在XPath中添加
[3]
是行不通的。@JeffC恐怕你又没能理解OP尝试了什么,以及我的解决方案是如何引导他解决问题的。我确信您仍然不知道OP是如何将
[3]
findElement()
findElements()一起使用的。请尽最大努力了解OP需要什么,以及解决方案如何解决您无法即兴解决的问题。OP已经有了一个定位器,可以找到这三个元素。将定位器更改为查找完全相同的三个元素的其他方法没有任何帮助。恐怕我不知道你为什么认为这有什么作用。可能你误读了OP的问题,需要重新阅读。OP提到了xpath为
//a[@aria posinset='3'并包含(text(),'Quotes')]
的定位器,该定位器通过Chrome开发者工具识别3个类似的子节点。也许您需要查看xpath文档,然后您将了解我的答案中的xpath,即
“//parent\u tag//following sibling::a[3]”
,将只标识一个元素。您的定位器不会标识任何内容,因为它充满了占位符信息。我的观点是OP已经发布了一个定位器来定位这三个元素,其中一个是正确的元素。如果您想发布一个选择单个正确元素的定位器,也许您应该从一个有效的定位器开始,然后向其添加一个索引,等等,让它定位OP想要的元素。我认为这不是最好的方法,因为它不是动态的。这就是为什么我在尝试回答之前要问更多的信息。不起作用。这是我第一次尝试的XPath之一。它给出了org.openqa.selenium.NoSuchElementException。JavascriptExecutor也不工作。我试过这些,但没有成功。
//div[@role='Main']/div[2]/div[@role='Navigation']/nav/ul/li/a[@aria-posinset='3' and contains(text(),'Quotes')]
Element <a id="navigationitemu3p1aB5MBqswlRFv6wRSym_91" class="sapUiUx3NavBarItem" href="#"> is not clickable at point (902.2166519165039,67.25833129882812) because another element <div id="sapClientBusyIndicatorMobileContainer" class="sapClientBusyIndicatorMobileContainer"> obscures it
driver.findElement(By.xpath("//parent_tag//following-sibling::a[3]")).click();
driver.findElement(By.xpath("(//a[@aria-posinset='3' and contains(text(),'Quotes')])[3]")).click();
WebElement element = driver.findElement(By.xpath("(//a[@aria-posinset='3' and contains(text(),'Quotes')])[3]"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);