Selenium如何判断元素是否有child?

Selenium how to determine if element has child?

我正在通过 C# 使用 Selenium。我使用此 XPath 获取所有 children 元素

element.FindElements(By.XPath("./child::*"));

虽然如果没有child,它会在超时后抛出错误。我正在寻找一种简单的方法来确定它是否具有 child 或不避免异常。

FindElements returns一个列表,所以可以查看列表的大小,如果为0,说明没有子元素

Java

List<WebElement> childs = rootWebElement.findElements(By.xpath(".//*"));
int numofChildren = childs.size();

C#

IReadOnlyList<IWebElement> childs = rootWebElement.FindElements(By.XPath(".//*"));
Int32 numofChildren = childs.Count;

根据你的问题获取父节点的所有子节点你可以使用FindElements()方法following-sibling::* xpath 中的属性如下:

  • 示例代码块:

    List<IWebElement> textfields = new List<IWebElement>();
    textfields = driver.FindElements(By.XPath("//desired_parent_element//following-sibling::*"));
    

    注意:当FindElements()隐式显式结合使用时等待,FindElements() 方法将在找到的集合中的项目超过 0 时立即 return,或者如果达到超时将 return 一个空列表。

  • XPath 详细信息:

    • 说明:此 xpath 技术用于定位特定节点的同级元素。
    • 解释:xpath 表达式获取使用 desired_parent_element.[= 定位的父元素的所有兄弟元素45=]
bool HasChild(IWebElement element)
{
    //Save implicit timeout to reset it later 
    var temp = driver.Manage().Timeouts().ImplicitWait;

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
    bool exists = element.FindElements(By.XPath(".//*")).Count > 0;
    driver.Manage().Timeouts().ImplicitWait = temp;

    return exists;
}

最简单的方法是:

boolean hasChildren(WebElement node) {
    return node.findElements(By.xpath("./descendant-or-self::*")).size() > 1;
}

在Javascript中完成:

var childElements = await element.findElements(By.xpath('.//*'));
    for (i = 0; i <= childElements.length; i++) {
        var elementId = await childElements[i].getAttribute("id");
        await console.log(elementId);
    }