【问题标题】:Clicking on a hypertext link using XPath使用 XPath 单击超文本链接
【发布时间】:2012-10-25 20:30:46
【问题描述】:

抱歉,如果这是一个愚蠢的问题 - 我是 Selenium 的新手。

我有一个正在测试的网页,它的表格中有几个超文本链接。 HTML 如下所示:

<table>
  <thead>
    <tr>
      <td><b>History</b></td>
      <td><b>Attributes</b></td>
      <td><b>Xml</b></td>
    </tr>
  </thead>
  <tbody>    
    <tr>
      <td><a href=link here>Show</a></td> 
      <td><a href=link here>Show</a></td>
      <td><a href=link here>Show</a></td> 
    </tr>
  </tbody>
</table>

我想测试对每个“显示”链接的点击。它们都有相同的文本,所以我无法通过链接文本引用它们。我一直通过 XPath 引用它们,因此:

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/thead/tr/td[1]").getText()

正确返回“历史”和

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/tbody/tr/td[1]").getText()

正确返回“显示”。

所以我认为:

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/tbody/tr/td[1]")).click()

将单击第一列中的“显示”链接。但它没有 - 没有任何反应。

如果我这样做:

driver.findElement(By.linkText("Show")).click()

它点击第一个“显示”链接,这是我所期望的。

我也可以:

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2].1.0")).click()

这样就行了

driver.findElement(By.xpath("(//a[contains(text(),'Show')])[2]")).click()

所以,总而言之,所有这些工作:

driver.findElement(By.linkText("Show")).click()
driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2].1.0")).click()
driver.findElement(By.xpath("(//a[contains(text(),'Show')])[1]")).click()

但这不是:

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/tbody/tr/td[1]")).click()

为什么?

【问题讨论】:

  • 我认为你应该更深入地关注一个元素,到 td 中的 adriver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/tbody/tr/td[1]/a")).click() 。您应该点击链接,而不是包含它的单元格。
  • 谢谢,汤姆 - 成功了。
  • 我会添加它作为答案。

标签: java xpath selenium click


【解决方案1】:

您可以使用findElements 将所有链接聚集在一起,然后遍历数组。

示例 - List&lt;WebElement&gt; inputs = driver.findElements(By.xpath("//input"));

在你的情况下

List&lt;WebElement&gt; links = driver.findElements(By.linkText("Show"));

然后遍历links 并点击它们中的每一个

【讨论】:

  • 这不会有帮助,因为我不知道我点击的是哪个“显示”链接 - 它们可以(可以想象)按任何顺序排列。
  • 不,它将与源 HTML 中显示的顺序相同。我建议在忽略它之前尝试一下。
  • 是的,但我不会在运行时检查 HTML 以了解它们的顺序。
【解决方案2】:

注意有问题的表达式

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/tbody/tr/td[1]")).click()

选择td 元素,如果没有定义链接或事件。虽然在浏览器中单击它应该会打开一个链接,但它只会发生,因为您有效地单击了标签内的内容以及 td 本身。上面的代码只点击了td,忽略了它的内容。

您必须更深入一步,到达您当前选择的td 中的a 元素。像这样:

driver.findElement(By.xpath("//div[@id='content']/div/form/div/table[2]/tbody/tr/td[1]/a")).click()

【讨论】:

    【解决方案3】:

    列表链接 = driver.findElements(By.tagName("a"));

    然后遍历链接并使用 for 循环单击每个链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-26
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多