如何使用Selenium C#WebDriver查找所有父元素?

如何使用Selenium C#WebDriver查找所有父元素?,selenium,selenium-webdriver,Selenium,Selenium Webdriver,我有一个变量,它是由类生成的。我希望通过调用FindElements返回相应的元素以及该的所有父元素。如何执行此操作?如果我正确理解了您的问题,您希望通过元素找到,然后找到父元素,直到找到根 您只需使用XPath获取父元素,直到到达页面根。比如说: public ReadOnlyCollection<IWebElement> FindElementTree(By by) { List<IWebElement> tree = new List<IWebElem

我有一个变量,它是由类生成的。我希望通过调用
FindElements
返回相应的元素以及该
的所有父元素。如何执行此操作?

如果我正确理解了您的问题,您希望通过
元素找到
,然后找到父元素,直到找到根

您只需使用XPath获取父元素,直到到达页面根。比如说:

public ReadOnlyCollection<IWebElement> FindElementTree(By by)
{
    List<IWebElement> tree = new List<IWebElement>();

    try
    {
        IWebElement element = this.driver.FindElement(by);
        tree.Add(element); //starting element

        do
        {
            element = element.FindElement(By.XPath("./parent::*")); //parent relative to current element
            tree.Add(element);

        } while (element.TagName != "html");
    }
    catch (NoSuchElementException)
    {
    }

    return new ReadOnlyCollection<IWebElement>(tree);
}
public ReadOnlyCollection findelementree(By)
{
列表树=新列表();
尝试
{
IWebElement元素=此.driver.FindElement(按);
tree.Add(元素);//起始元素
做
{
element=element.FindElement(By.XPath(“./parent::*”);//相对于当前元素的父元素
添加(元素);
}while(element.TagName!=“html”);
}
捕获(无接触元素异常)
{
}
返回新的只读集合(树);
}
您可以选择在
主体
元素而不是
html
元素上停止


还要注意,这相当慢,特别是如果它是一个嵌套很深的元素。一个更快的替代方法是使用
ExecuteScript
运行一个使用相同逻辑的javascript片段,然后一次返回所有元素。

我创建了WebElement扩展,希望有用

public static IWebElement GetElementParentByClass(this IWebElement element, string ClassName)
{
    try
    {
        IWebElement parent = element;
        do
        {
            parent = parent.FindElement(By.XPath("./parent::*")); //parent relative to current element

        } while (!parent.GetAttribute("class").Equals(ClassName));

        return parent;
    }
    catch (Exception ex)
    {
        return null;
    }
}
正如.XPath(“./祖先或self::*”)在这里提到的
应该实现相同的目标,并返回所有祖先(包括父级)。