我有一个我遍历的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 {{1}的列表正如我所料,
EDIT_2:
这是我需要抓取的信息:
来自父级的:类名,它的类名用作一种布尔值,如果它不是另一种方式,它看起来是一种方式。
来自子1的:它是可视的,基于这个布尔类名,也有一个唯一的类名,这使得它易于抓取
来自孩子2的:它是文本的,我需要文本,没有ID或类名来找到它。
答案 0 :(得分:0)
您是否必须使用By.cssSelector(".parent")
?您可以考虑在循环中的By.className("parent")
网络元素上使用graph
。您也可以在By.xpath(".//parent")
元素上使用graph
。我知道Xpath不是那么快,也不是很干净,但它只需要几微秒,所以应该值得找到你想要的对象。 className()
选项应该可以工作,虽然我更倾向于信任Xpath,因为我可以明确告诉它要拉什么元素(这对我来说在倾向于重用类名的网站上证明是有用的)。
答案 1 :(得分:0)
我想我明白你在问什么......看看这是否有帮助。看起来你走的是这条路,但我不确定你走了多远。
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 Selector直接潜入您想要的孩子,例如
driver.findElements(By.cssSelector("div.graph div.child"));
循环浏览这些元素,直到找到所需的元素,然后执行
foundElement.findElement(By.xpath(".."));
获取父母。它有点笨重,但它会完成工作。
答案 2 :(得分:0)
所以我只能使用不同的css选择器来解决问题。
graph.findElements(By.cssSelector("table:nth-child(2) td"));
返回3个WebElement
的列表;这是错误的。
graph.findElements(By.cssSelector("table.mar10t td"));
返回2 WebElement
的列表;这是对的。
很奇怪,因为如果我在firebug中使用css selector搜索,两条路径都会给出相同的结果...
如果有人想到第一个给出错误结果的原因请评论,我很乐意阅读它们。