Selenium如何确定元素是否有孩子?

时间:2018-05-16 10:22:24

标签: c# selenium

我通过c#使用Selenium。我使用这个xpath来获取所有元素

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

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

5 个答案:

答案 0 :(得分:1)

FindElements返回一个列表,因此您可以检查列表的大小,如果它是零,则表示没有子元素

爪哇

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

C#

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

答案 1 :(得分:1)

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

  • 示例代码块:

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

    注意:当FindElements()隐式显式等待使用时,FindElements()方法将返回为一旦找到的集合中有超过0个项目,或者如果达到超时则返回空列表。

  • XPath详细信息:

    • 描述:此 xpath 技术用于定位特定节点的兄弟元素。
    • 说明: xpath 表达式使用 desired_pa​​rent_element 获取父元素的所有兄弟元素。

答案 2 :(得分:0)

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;
}

答案 3 :(得分:0)

最简单的方法是:

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

答案 4 :(得分:0)

使用Java脚本操作

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);
    }