我有一个By
类的变量。我希望调用FindElements
来返回相应的元素以及此By
的所有父元素。我该怎么做?
答案 0 :(得分:6)
如果我正确理解了您的问题,您希望找到By
元素,然后找到父母直到根。
您可以使用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);
}
您可以选择停在body
元素而不是html
元素上。
另请注意,这是相当慢的,特别是如果它是一个深层嵌套的元素。更快的替代方法是使用ExecuteScript
运行使用相同逻辑的javascript片段,然后立即返回所有元素。
答案 1 :(得分:0)
我创建了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;
}
}