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

时间:2015-08-19 19:18:53

标签: css selenium

我有一个我遍历的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或类名来找到它。

3 个答案:

答案 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搜索,两条路径都会给出相同的结果...

如果有人想到第一个给出错误结果的原因请评论,我很乐意阅读它们。