【问题标题】:Java and Selenium, Clicking element by xpath using containsJava和Selenium,通过xpath使用包含单击元素
【发布时间】:2016-06-01 14:36:12
【问题描述】:

我在单击使用 Selenium 和 Java 的元素时遇到问题。这是桌子的样子。

<tr class="even">
<td class="linked-item">
<a title="Imported Gatekeeper" href="/rss-servlet/remotesupport/viewgatekeeper.action?siteId=20">SJHS_OK - Technology Center   -  (CWx Network Connectivity)</a>
</td>
</tr>
<tr class="odd">
<td class="linked-item">
<a title="Imported Gatekeeper" href="/rss-servlet/remotesupport/viewgatekeeper.action?siteId=26">SJHS_OK - Technology Center   -  (CWx Network Connectivity) - Backup</a>
</td>
</tr>

我正在尝试选择第一个元素 SJHS_OK - Technology Center - (CWx Network Connectivity),它是指向另一个页面的链接。这只是代码的一部分,还有很多。

当我尝试使用 contains 时出现问题,我的 xpath 看起来像这样: //*[@title='Imported Gatekeeper'][contains(.,'SJHS_OK - Technology Center - (CWx Network Connectivity)')][not(contains(.,'Backup'))] 有时当我将它放入 firepath 时,它会工作并找到元素,有时却不会。不知道为什么它并不总是有效。

我的 Java 代码如下所示: String gatekeeper = "SJHS_OK - Technology Center - (CWx Network Connectivity)" DRIVER.findElement(By.xpath("//*[@title='Imported Gatekeeper']"+gatekeeper+"[not(contains(.,'Backup'))]")).click();

我这样做是为了可以轻松更改网守变量并选择不同的网守。门卫将从 Excel 工作表中拉出。

任何关于此处错误的帮助将不胜感激,或者我可以通过另一种方式找到可以通过变量更改的元素来单击它。

【问题讨论】:

  • 可能会在程序中引入等待或睡眠并尝试

标签: java selenium xpath


【解决方案1】:

如果 xpath 有时能找到有时不能,问题可能是缺少等待。如果当您尝试单击该元素不存在或不可见时,代码将引发错误。试试看:

WebElement yourElement = (new WebDriverWait(driver, 10))
    .until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@title='Imported Gatekeeper'][contains(.,'SJHS_OK - Technology Center   -  (CWx Network Connectivity)')][not(contains(.,'Backup'))]")));

@编辑

由于等待不工作,代码有时工作,有时不工作,当页面被渲染时,没有固定数量的空格来填充文本。试试这个 xpath 选择器:

//a[@title='Imported Gatekeeper'][text()[contains(., 'SJHS_OK')]][contains(., 'Technology Center')][contains(., 'CWx')][contains(., 'Network')][contains(., 'Connectivity')][not(contains(.,'Backup'))]

另外,当测试工作时,在 google chrome 控制台中尝试所有这些选择器,而不是在 chrome 控制台中。您可以使用 $x("your xpath here") 测试 xpath

【讨论】:

  • 我尝试了等待,无论我给它多少时间,它都会超时。我觉得路径有问题,因为它有时在 firepath 中起作用,有时却不起作用,而且我真的看不出它起作用和不起作用的区别。
  • 我认为 xpath 不是问题。或者 xpath 是否有效。如果有时工作有时不工作,则有一些外部干扰
【解决方案2】:

您不必为此使用 xpath。如果你使用的是 Java8 试试这个:

driver.findElements(By.tagName("a")).stream()
    .filter(td -> !td.getText().contains("Backup"))
    .findFirst().get().click();

如果可以通过任何一种方式找到该元素,则其下方可能有一些东西,也许元素没有完全加载? 发生错误时可以提供堆栈跟踪吗?

【讨论】:

    【解决方案3】:

    我发现当我将SJHS_OK - Technology Center - (CWx Network Connectivity直接从Xpath中复制出来时它会起作用,但如果我自己输入它,即使比较时它是准确的,它也不起作用。我的结论是它与空格有关。如果我将其删除而没有空格,则错误会消失。

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 2014-11-02
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多