Selenium:使用WebElement.findElements()来缩小结果



我有一个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两个路径给出相同的结果…

如果有人对为什么第一个给出错误的结果有想法,请评论,我很乐意阅读它们。

最新更新