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

「これは一部です」を取得することは自明ではありません。たとえば、これは「This is some text」を返します。

driver.find_element_by_id('a').text

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

(以下に回答を提供していますが、誰かがより恐ろしい解決策を思い付くことができる場合に備えて、質問を開いたままにします)。

4

5 に答える 5

29

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

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) 

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

于 2013-09-26T23:26:51.443 に答える
4
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
于 2012-09-07T21:11:59.563 に答える
3

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

于 2012-09-12T23:56:56.217 に答える