我看到的所有findElement(By.xpath)示例都在搜索整个页面,例如
WebElement td = driver.findElement(By.xpath("//td[3]"));
我想要实现的目标是:
WebElement tr = ... // find a particular table row (no problem here)
WebElement td = tr.findElement(By.xpath("/td[3]")); // Doesn't work!
我也尝试了其他变种而没有运气:“td [3]”,“child :: td [3]”
使用“// td [3]”查找整个页面中的第一个匹配节点,即不限于我的tr。所以看起来就像当你通过xpath找到元素时,你调用findElement()的WebElement一无所获。
是否可以将findElement(By.xpath)范围限定为特定的WebElement?
(我正在使用Chrome,以防万一。)
请注意: By.xpath(“// td [3]”)只是一个例子。我不是在寻找实现同样目标的替代方法。问题是试图确定foo.findElement()在与By.xpath选择器一起使用时是否会注意到foo。
答案 0 :(得分:11)
根据ZzZ的回答,我认为问题在于您尝试的查询是绝对的而不是相对的。通过使用起始/
,您可以强制进行绝对搜索。而是使用标签名称作为ZzZ建议,./
或.//
。
查看“位置路径表达式”下的XPath docs
答案 1 :(得分:4)
我也遇到了这个问题,花了很多时间试图找出解决方法。这就是我想到的:
WebElement td = tr.findElement(By.xpath("td[3]"));
不确定原因,但这对我有用。
答案 2 :(得分:2)
我认为这可能是Selenium2使用xpath的方式中的一个错误。但是,我相信我之前使用“:: ancestor”成功地限制了范围。
无论如何,您是否尝试使用Css选择器来解决此问题?这是你的选择吗?试试这个:
tr.findElement(By.cssSelectors( “TD:第n的式(3)”));
这应该可以完成工作并且与您最初尝试的相同:
tr.findElement(By.xpath( “// TD [3]”));
答案 3 :(得分:0)
what i m understanding that u want to retrieve a particular td from a tr, so here's a snippet you can try it with your code to find 3rd td...
WebElement tr=//...find a particular table row
List<WebElement> columns = tr.findElements(By.tagName("td"));
Iterator<WebElement> j = columns.iterator();
int count=0;
while(j.hasNext())
{
WebElement column = j.next();
if(count==2)
{
System.out.print(column.getText());
}
count++;
}
You can change count value in if condition to retrieve another td..
Hope this will help you..
答案 4 :(得分:0)
WebElement td = tr.findElement(By.xpath(“/ td [3]”));
如果您只想查找tr的子元素,请使用相对路径而不是绝对路径。
这应该有效:
int index = 3;
List<WebElement> tds = tr.findElements(By.xpath(".//td"));
System.out.println(tds[index].getText());