Search code examples
pythonhtmlseleniumselenium-webdriver

How can I get text of an element in Selenium WebDriver, without including child element text?


Consider:

<div id="a">This is some
   <div id="b">text</div>
</div>

Getting "This is some" is nontrivial. For instance, this returns "This is some text":

driver.find_element_by_id('a').text

How does one, in a general way, get the text of a specific element without including the text of its children?


Solution

  • Here's a general solution:

    def get_text_excluding_children(driver, element):
        return driver.execute_script("""
        return jQuery(arguments[0]).contents().filter(function() {
            return this.nodeType == Node.TEXT_NODE;
        }).text();
        """, element)
    

    The element passed to the function can be something obtained from the find_element...() methods (i.e., it can be a WebElement object).

    Or if you don't have jQuery or don't want to use it, you can replace the body of the function above with this:

    return self.driver.execute_script("""
    var parent = arguments[0];
    var child = parent.firstChild;
    var ret = "";
    while(child) {
        if (child.nodeType === Node.TEXT_NODE)
            ret += child.textContent;
        child = child.nextSibling;
    }
    return ret;
    """, element)
    

    I'm actually using this code in a test suite.