使用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
在你的情况下
List
然后迭代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循环单击它们中的每一个