我有一个WebElements
的列表,我迭代,让我们称之为List
图,每个元素是一个图(即for (WebElement graph : graphs)
)。每个图都有一些后代,其中一些在多个图中是相似的。所以我想这样说:
List<> descendents = graph.findElements(By by)
来得到这些后代,尽管目前它也在其他图中找到类似的后代。我用的是By.cssSelector()
。这些子代也有子代,我可以使用css选择器来查找这些子代,结果仅限于单个图形,但我需要这些子代的父节点的信息,所以我不能这样做。
谁能解释一下为什么会发生这种情况?或者有没有办法先找到孩子,然后再找到父母?
我在想:graph.findElements(By.cssSelector(".child:parent")
,但这不是一个有效的css选择器。
如果有什么不清楚的地方,请告诉我。
谢谢!
EDIT_1:这是我正在看的层次结构:
<div class="graph">
<...several nested tags...>
<div class="parent">
<div class="child" />
<div class="child" />
</div>
<...several nested tags.../>
</div>
<div class="graph">
<...several nested tags...>
<div class="parent">
<div class="child" />
<div class="child" />
</div>
<...several nested tags.../>
</div>
<div class="graph">
<...several nested tags...>
<div class="parent">
<div class="child" />
<div class="child" />
</div>
<...several nested tags.../>
</div>
在这种情况下,使用graph.findElements(By.cssSelector(".parent"))
返回3个WebElement
的列表,我想只有1个,但使用graph.findElements(By.cssSelector(".child"))
返回2个WebElement
的列表…如我所料
EDIT_2:
这里是我需要抓取的信息:
来自父类:类名,它的类名被用作一种布尔值,如果存在,它看起来是一种方式,如果不存在,它看起来是另一种方式。
从子1:它是可视的,基于这个布尔类名,也有一个唯一的类名,这使得它很容易抓取
from child 2:它是文本的,我需要文本,没有ID或类名来定位它。
必须使用By.cssSelector(".parent")
吗?您可以考虑在循环中的graph
web元素上使用By.className("parent")
。您也可以在graph
元素上使用By.xpath(".//parent")
。我知道Xpath没有那么快,也没有那么干净,但它只需要花费几微秒的时间,因此应该值得获得您正在寻找的对象。className()
选项应该可以工作,不过我更倾向于相信Xpath,因为我可以显式地告诉它要拉取什么元素(在倾向于重用类名的站点上,这对我很有用)。
我想我明白你的意思了…看看这是否有帮助。看起来你沿着这条路走了,但我不确定你走了多远。
List<WebElement> graphs = driver.findElements(By.cssSelector("div.graph"));
for (WebElement graph : graphs)
{
List<WebElement> parents = graph.findElements(By.cssSelector("div.parent"));
for (WebElement parent : parents)
{
List<WebElement> children = parent.findElements(By.cssSelector("div.child"));
for (WebElement child : children)
{
if (child.getText().trim().equals("abc123"))
{
// found what I'm looking for... do something to the parent
System.out.println(parent.getText().trim());
// at some point you may want to break; from the nested loops
}
}
}
}
另一个选择是使用CSS选择器直接跳转到你想要的子元素,例如
driver.findElements(By.cssSelector("div.graph div.child"));
循环遍历这些元素,直到找到需要的元素,然后执行
foundElement.findElement(By.xpath(".."));
获取父节点。这是有点笨拙,但它会完成工作。
所以我可以通过使用不同的css选择器来解决这个问题。
graph.findElements(By.cssSelector("table:nth-child(2) td"));
返回一个包含3个WebElement
的列表;这是错误的。
graph.findElements(By.cssSelector("table.mar10t td"));
返回一个包含2个WebElement
的列表;
这是奇怪的,因为如果我使用css选择器搜索在firebug两个路径给出相同的结果…
如果有人对为什么第一个给出错误的结果有想法,请评论,我很乐意阅读它们。