【问题标题】:How to find the child elements of a specific WebElement (which I don't know the xpath to)如何找到特定 WebElement 的子元素(我不知道 xpath)
【发布时间】:2017-12-23 19:04:43
【问题描述】:

我有任意数量的具有唯一类名的图块。其中一个有一个独特的标题,所以我正试图专门抓住那个。完成此操作后,我想要在其结构中相当深入地引用子元素。

做“平铺”。 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: no such element: Unable to locate element: {"method":"xpath","selector":"/[2]/[ 2]/[1]/[3]"} 这不是有效的 xpath。

这个问题与Selenium 2 - Can findElement(By.xpath) be scoped to a particular element? 非常相似,但人们似乎要么误解了它,要么我的用例不同。

【问题讨论】:

  • 您是否将“tiles”用于其他用途,或者您只是将其用作获取子元素的垫脚石?顺便说一句,您试图用来获取子元素的 xpath 太可怕了。这种风格肯定会被破坏并且很难调试。如果您发布 html 示例,我相信我们能够为您提供更好的东西。
  • 网站的网址是什么?

标签: java selenium xpath selenium-webdriver


【解决方案1】:

API documentationfindElements() 表示:

使用 xpath 时,请注意 webdriver 遵循标准约定:以“//”为前缀的搜索将搜索整个文档,而不仅仅是当前节点的子节点。使用“.//”将您的搜索限制在此 WebElement 的子元素中。

所以您应该能够执行以下操作:

WebElement foo = driver.findElement(By.xpath("//*[@title='" + title + "']"));
WebElement bar = foo.findElement(By.xpath(".//img"));

第二个 xpath 中的前导点会有所不同,因为它只会搜索 foo 的子元素。

【讨论】:

    【解决方案2】:

    有类似问题的主题! - 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::*"));
    

    然后在您的代码中过滤/处理它们...

    【讨论】:

    • 请添加一些描述
    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2021-12-15
    相关资源
    最近更新 更多