我通过c#使用Selenium。我使用这个xpath来获取所有元素
element.FindElements(By.XPath("./child::*"));
虽然如果没有子节点,它会在超时后抛出错误。我正在寻找一种简单的方法来确定它是否有孩子以避免异常。
答案 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详细信息:
答案 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);
}