我有一个具有唯一类名的任意数量的tile。其中一个有一个独特的标题,所以我试图专门抓住那个。一旦我完成了这项工作,我希望在其结构中更深入地引用子元素。
" tile。" tile.findElement()的一部分在这里为我做什么?我想专门使用相对于tile的xpath。
public WebElement getArticleTileByTitle(String title){
By xpath = By.xpath(".//div[contains(., '" + title + "') or @title='" + title + "']");
List<WebElement> tiles = findPresentElements(By.className("articleTile"));
for(WebElement tile : tiles){
if(isElementPresent(tile, xpath))
return tile;
}
return null;
}
public boolean articleTileImageIsVisible(WebElement tile){
WebElement background = tile.findElement(By.xpath("/*[2]/*[2]/*[1]/*[3]")); //This throws NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/*[2]/*[2]/*[1]/*[3]"}
//figure out stuff about background
}
我知道背景属于img类型,所以我已经尝试了
tile.findElement(By.xpath("./img/*[2]/*[2]/*[1]/*[3]"));
tile.findElement(By.xpath("./*/*[2]/*[2]/*[1]/*[3]"));
tile.findElement(By.xpath(".//*/*[2]/*[2]/*[1]/*[3]"));
tile.findElement(By.xpath("./*/*[2]/*[2]/*[1]/*[3]"));
从不如此,我不断在NoSuchElementException上获得变化:没有这样的元素:无法找到元素:{&#34;方法&#34;:&#34; xpath&#34;,&#34;选择器&#34; :&#34; / [2] / [2] / [1] / [3]&#34;}并且这不是有效的xpath
这个问题与Selenium 2 - Can findElement(By.xpath) be scoped to a particular element?非常相似,但人们似乎误解了它或者我的用例不同。
答案 0 :(得分:1)
findElements()
的{{3}}说:
使用xpath时请注意webdriver遵循标准约定:以“//”为前缀的搜索将搜索整个文档,而不仅仅是当前节点的子节点。使用“.//”将搜索范围限制为此WebElement的子项。
所以你应该能够做到这样的事情:
WebElement foo = driver.findElement(By.xpath("//*[@title='" + title + "']"));
WebElement bar = foo.findElement(By.xpath(".//img"));
第二个xpath中的前导点完全不同,因为它只会搜索foo
的子元素。
答案 1 :(得分:0)
有类似问题的话题! - XPath to get all child nodes (elements, comments, and text) without parent
该主题的这一部分可能会让您感兴趣。
<块引用>child::*
选择所有元素
上下文节点的子节点
child::text()
选择所有文本节点
上下文节点的子节点
child::node()
选择所有
上下文节点的子节点,无论
他们的节点类型
我们可以从父节点中识别子节点,方法是将其与父节点一起定位,然后将 ( ./child::*)
作为参数传递给 findElements(By.xpath(""))
var childs = parent.findElements(By.xpath("./child::*"));
然后在您的代码中过滤/处理它们...