Selenium 2 - 可以将findElement(By.xpath)限定为特定元素吗?

时间:2011-08-24 18:14:10

标签: selenium selenium-webdriver

我看到的所有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。

5 个答案:

答案 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());