【问题标题】:Dealing with dynamic ids. How do I click on exactly the 3rd highlight of this xpath?处理动态ID。如何准确单击此 xpath 的第三个亮点?
【发布时间】:2018-03-31 11:08:01
【问题描述】:

我有一个 SAPUI 页面,我正在使用 Selenium WebDriver 作为自动化测试框架进行导航。

在我遇到点击的流程中有一个点实际上有 3 个类似的 xpath。

问题在于 id 是动态的,除了 aria-posinset 和文本之外的所有其他内容也是动态的。我永远无法通过使用 id 来点击它。另外,我仍然无法使用下面的 xpath 来点击它。它只是说元素不可点击。当我使用 Chrome 开发工具通过 :hover 查找 xpath 时,下面的第三个突出显示是实际悬停在点击上的那个。所以,我想使用这个 xpath 的第三个亮点。各位大神能帮帮我吗?

这是有问题的 xpath:

//a[@aria-posinset='3' and contains(text(),'Quotes')]

这些是 Chrome 开发者工具中具有相同 xpath 的 3 个亮点。

1:

<a id="navigationitemNAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c_2293" data-sap-ui="navigationitemNAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c_2293" data-flex-dragtype="FacetTab" data-flex-modelid="NAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c" data-flex-component="/BYD_COD/SalesOnDemand/Opportunity/UI/COD_Opportunity_TI.TI.uicomponent&amp;null" data-sap-automation-id="NAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c" href="#" aria-setsize="18" aria-posinset="3" role="menuitemradio" class="sapUiUx3NavBarItem" aria-checked="false">Quotes</a>

2.

<a id="navigationitemNAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c_3033" data-sap-ui="navigationitemNAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c_3033" data-flex-dragtype="FacetTab" data-flex-modelid="NAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c" data-flex-component="/BYD_COD/SalesOnDemand/Opportunity/UI/COD_Opportunity_TI.TI.uicomponent&amp;null" data-sap-automation-id="NAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c" href="#" aria-setsize="18" aria-posinset="3" role="menuitemradio" class="sapUiUx3NavBarItem" aria-checked="false">Quotes</a>

3.

<a id="navigationitemNAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c_3773" data-sap-ui="navigationitemNAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c_3773" data-flex-dragtype="FacetTab" data-flex-modelid="NAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c" data-flex-component="/BYD_COD/SalesOnDemand/Opportunity/UI/COD_Opportunity_TI.TI.uicomponent&amp;null" data-sap-automation-id="NAVIGATIONITEMID_7bc2f6d569b74f2fa33d38fa9962135c" href="#" aria-setsize="18" aria-posinset="3" role="menuitemradio" class="sapUiUx3NavBarItem" aria-checked="false">Quotes</a>

如何在此处单击第三个 xpath?我实际上想点击“报价”,这将继续前进。

以防万一我不清楚,我将 Selenium WebDriver 与 Java 一起使用,浏览器是 Firefox。

更新:

我尝试使用 Actions 类,但即使这样也失败了,但这次出现了不同的错误:

//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

【问题讨论】:

  • 如果我没记错的话,您的第一个和第二个 &lt;a&gt; 标签是相同的,这与预期不符。请问可以再看一遍吗?
  • 我改了
  • 您遇到异常了吗?还是它找到了错误的元素?这个 xpath 对我有用 xpath=//a[text()='Quotes'][3]
  • 无法点击xpath定义的元素。我没有像你说的那样使用[3]。所以按照语法,我应该在最后添加一个 [3] 吗?因为当我在我的 xpath 中使用 [3] 时,就像在原始帖子中一样,它不起作用。
  • 我假设这是一些更大的表格的一部分,等等。您可能必须根据包含的其他元素的文本单击引用链接,例如这些是事物 A、事物 B 和事物 C 的引用链接,您想要单击事物 C 旁边的引用链接。为第三个链接发布一些周围的 HTML,并告诉我们第三个链接是什么让您想要点击它,即它在文本 Thing C 或其他内容旁边。

标签: java selenium firefox webdriver sapui5


【解决方案1】:

根据您分享的 HTML,很难构建一个正确的答案,因为所有 3 个元素都具有相似的属性,没有 iddata-sap-ui 属性的最后部分。 p>

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

driver.findElement(By.xpath("//parent_tag//following-sibling::a[3]")).click();

注意:将parent_tag替换为正确的tagName[attribute='value']

【讨论】:

  • OP 已经发布了返回三个元素的 XPath。这个答案增加了什么?他已经说过将[3] 添加到XPath 是行不通的。
  • @JeffC 恐怕您再次无法理解 OP 尝试了什么以及我的解决方案如何试图引导他解决问题。我相信您仍然不知道 OP 如何将[3]findElement()findElements() 一起使用。请非常小心地了解 OP 的要求以及解决方案如何解决您不会即兴发挥的问题。
  • OP 已经有一个定位器可以找到这三个元素。将该定位器更改为查找完全相同的三个元素的其他方法无济于事。我不知道你为什么认为这会有所贡献。
  • 我害怕。可能您误读了 OP 的问题,需要重新阅读。 OP 提到了 xpath//a[@aria-posinset='3' and contains(text(),'Quotes')] 的定位器,它通过 Chrome Developer Tool 识别 3 个相似的 子节点。也许您需要查看 xpath 文档,然后您就会明白我的答案中的 xpath"//parent_tag//following-sibling::a[3]" 将仅识别 一个单个 元素仅限。
  • 您的定位器无法识别任何内容,因为它充满了占位符信息。我的观点是 OP 已经发布了一个定位器来定位三个元素,其中一个是正确的元素。如果您想发布一个选择单个正确元素的定位器,也许您应该从一个可以工作的定位器开始,然后为其添加一个索引等,以使其定位到 OP 想要的元素。我认为这不是最好的方法,因为它不是动态的。这就是为什么我在尝试回答之前要求提供更多信息。
【解决方案2】:

尝试使用它,它会点击网页上的第三个元素。

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

完整代码:

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);

【讨论】:

  • 不起作用。这是我尝试的第一个 xpath 之一。它给出了 org.openqa.selenium.NoSuchElementException。 JavascriptExecutor 也不工作。我已经尝试了这些但没有成功。
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多