Java和Selenium,使用包含的xpath单击元素

时间:2016-06-01 14:36:13

标签: java selenium xpath

我在使用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 - 技术中心 - (CWx网络连接),这是另一个页面的链接。这只是代码的一部分,远不止这些。

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

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

我这样做是为了让我可以轻松更改网守变量并选择不同的网守。看门人将从excel表中拉出来。

任何有关错误的帮助都会受到赞赏,或者我可以通过另一种方式找到可以通过变量更改的元素。

3 个答案:

答案 0 :(得分:0)

如果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'))]")));

<强> @Edit

由于等待不起作用且代码仍然有时有效,有时没有,当重新定义te页面时,没有足够数量的空格来填充文本。试试这个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

答案 1 :(得分:0)

您不必使用xpath。如果您使用的是Java8,请尝试使用:

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

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

答案 2 :(得分:0)

我发现当我复制SJHS_OK - 技术中心 - (CWx网络连接直接来自Xpath,那么它会起作用,但是如果我自己输入它,即使它在比较时是准确的,它也行不通。我的结论是因为它与空间有关。如果我在没有空格的情况下将其剪下来,错误就会消失。