如何获取Selenium WebDriver中的元素的文本(通过Python API),而不包括子元素文本?

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

获得“这是一些”是不平凡的。 例如,这返回“这是一些文本”:

 driver.find_element_by_id('a').text 

一般来说,一个人如何得到一个特定元素的文本,而不包括它的孩子的文本?

(我在下面提供了一个答案,但是如果有人能拿出一个不那么可怕的解决scheme,这个问题就会解决)。

这是一个通用的解决scheme:

 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) 

我实际上是在testing套件中使用这个代码。

您不必进行replace,您可以获取子文本的长度,并从总长度中减去该长度,然后切片到原始文本中。 这应该快得多。

 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