一尘不染

如何在Selenium WebDriver中获取元素的文本,而不包括子元素文本?

selenium

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

获得“这是一些”并非易事。例如,返回“ This is some text”:

driver.find_element_by_id('a').text

通常,如何获得特定元素的文本而不包含其子元素的文本?

(我在下面提供了一个答案,但是如果有人想出一个不太丑陋的解决方案,它将让问题悬而未决)。


阅读 564

收藏
2020-06-26

共1个答案

一尘不染

这是一个常规解决方案:

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)

传递给函数的元素可以是从find_element...()方法中获得的东西(即它可以是一个WebElement对象)。

或者,如果您没有jQuery或不想使用它,则可以用以下代码替换上面函数的主体:

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)

我实际上是在测试套件中使用此代码。

2020-06-26