Zdobądź wszystkie elementy potomne

Odpowiedzi:

130

Tak, możesz to osiągnąć za pomocą find_elements_by_css_selector("*")lub find_elements_by_xpath(".//*").

Jednak nie brzmi to jak prawidłowy przypadek użycia do znalezienia wszystkich elementów potomnych elementu. Zdobycie wszystkich bezpośrednich / pośrednich dzieci jest kosztowną operacją. Prosimy o dalsze wyjaśnienie, co próbujesz zrobić. Powinien być lepszy sposób.

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))
Yi Zeng
źródło
2
tylko dowiedzieć się, że .zanim //to ważne, jeśli kropka brakuje, nawet jeśli wywołanie metody z elementu, ponownie przeszukać cały HTML
Luk Aron
61

Tak, możesz użyć find_elements_by_do pobrania elementów podrzędnych do listy. Zobacz wiązania Pythona tutaj: http://selenium-python.readthedocs.io/locating-elements.html

Przykładowy kod HTML:

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

Możesz użyć find_elements_by_tak:

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

Jeśli potrzebujesz pomocy w konkretnym przypadku, możesz edytować swój post za pomocą kodu HTML, z którego chcesz uzyskać elementy nadrzędne i podrzędne.

Richard
źródło
* find_element_by_class_name
Iorek
1

Innym kultem find_elements_by_xpath(".//*")jest:

from selenium.webdriver.common.by import By


find_elements(By.XPATH, ".//*")
Jortega
źródło
-2

Oto kod do pobrania elementów podrzędnych (w języku 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++;
    }
 }
shikha nagar
źródło