获取所有子元素

时间:2014-07-17 05:00:43

标签: python selenium selenium-webdriver

在Selenium中使用Python可以将WebElement的所有子节点作为列表吗?

4 个答案:

答案 0 :(得分:79)

是的,您可以通过find_elements_by_css_selector("*")find_elements_by_xpath(".//*")来实现。

但是,这听起来不是一个有效的用例来查找元素的所有子项。获得所有直接/间接儿童是一项昂贵的手术。请进一步说明您要做的事情。应该有更好的方法。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.stackoverflow.com")

header = driver.find_element_by_id("header")

# start from your target element, here for example, "header"
all_children_by_css = header.find_elements_by_css_selector("*")
all_children_by_xpath = header.find_elements_by_xpath(".//*")

print 'len(all_children_by_css): ' + str(len(all_children_by_css))
print 'len(all_children_by_xpath): ' + str(len(all_children_by_xpath))

答案 1 :(得分:43)

是的,您可以使用find_elements_by_将子元素检索到列表中。请参阅此处的python绑定:http://selenium-python.readthedocs.io/locating-elements.html

示例HTML:

<ul class="bar">
    <li>one</li>
    <li>two</li>
    <li>three</li>
</ul>

您可以像find_elements_by_那样使用:

parentElement = driver.find_element_by_class_name("bar")
elementList = parentElement.find_elements_by_tag_name("li")

如果您需要有关特定案例的帮助,可以使用您希望从中获取父元素和子元素的HTML来修改帖子。

答案 2 :(得分:1)

find_elements_by_xpath(".//*")的另一个崇高之处是:

from selenium.webdriver.common.by import By


find_elements(By.XPATH, ".//*")

答案 3 :(得分:0)

以下是获取子元素的代码(在Java中):

String childTag = childElement.getTagName();
if(childTag.equals("html")) 
{
    return "/html[1]"+current;
}
WebElement parentElement = childElement.findElement(By.xpath("..")); 
List<WebElement> childrenElements = parentElement.findElements(By.xpath("*"));
int count = 0;
for(int i=0;i<childrenElements.size(); i++) 
{
    WebElement childrenElement = childrenElements.get(i);
    String childrenElementTag = childrenElement.getTagName();
    if(childTag.equals(childrenElementTag)) 
    {
        count++;
    }
 }