使用XPath单击超文本链接

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

我有一个我正在测试的网页,它在表格中有一些超文本链接。 HTML看起来像这样:

History Attributes Xml
Show Show Show

我想测试每个“显示”链接上的点击。 它们都有相同的文本,所以我不能通过https://stackoverflow.com/questions/13076765/clicking-on-a-hypertext-link-using-xpath/linktext引用它们。 我一直在用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.https://stackoverflow.com/questions/13076765/clicking-on-a-hypertext-link-using-xpath/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.https://stackoverflow.com/questions/13076765/clicking-on-a-hypertext-link-using-xpath/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() 

为什么?

您可以使用findElements收集所有链接,然后遍历数组。

示例 – List inputs = driver.findElements(By.xpath("//input"));

在你的情况下

List links = driver.findElements(By.linkText("Show"));

然后迭代links并单击它们中的每一个

请注意有问题的表达式

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

List links = driver.findElements(By.tagName(“a”));

然后迭代链接并使用for循环单击它们中的每一个