web-dev-qa-db-ja.com

子要素のテキストを含めずに、Selenium WebDriverの要素のテキストを取得する方法は?

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

「これは一部です」を取得するのは簡単ではありません。たとえば、これは「これはテキストです」を返します。

driver.find_element_by_id('a').text

一般的な方法で、子のテキストを含めずに特定の要素のテキストを取得するにはどうすればよいですか?

(私は以下の答えを提供していますが、誰かがそれほど恐ろしい解決策を思い付くことができない場合に備えて質問を開いたままにします)。

32
josh

一般的な解決策は次のとおりです。

_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がない場合、または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) 
_

私は実際にテストスイートでこのコードを使用しています。

24
Louis

置換を行う必要はありません。子テキストの長さを取得し、それを全体の長さから差し引き、元のテキストにスライスできます。それはかなり速いはずです。

4
kreativitea
def get_true_text(tag):
    children = tag.find_elements_by_xpath('*')
    original_text = tag.text
    for child in children:
        original_text = original_text.replace(child.text, '', 1)
    return original_text
3
josh