如何在不包含子元素文本的情况下获取 Selenium WebDriver 中元素的文本?

新手上路,请多包涵

考虑:

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

获得“这是一些”是非常重要的。例如,这将返回“这是一些文本”:

 driver.find_element_by_id('a').text

一般而言,如何在不包含其子元素文本的情况下获取特定元素的文本?

原文由 josh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

这是一个通用的解决方案:

 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)

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

原文由 Louis 发布,翻译遵循 CC BY-SA 4.0 许可协议

在您分享的 HTML 中:

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

文本 This is some 位于 文本节点 内。以结构化方式描述 文本节点

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


这个用例

使用 Seleniumpython 客户端从 文本节点 中提取和打印文本 This is some ,您有两种方法,如下所示:

  • Using splitlines() : You can identify the parent element ie <div id="a"> , extract the innerHTML and then use splitlines() as follows:

  • 使用 xpath

   print(driver.find_element_by_xpath("//div[@id='a']").get_attribute("innerHTML").splitlines()[0])

  • 使用 css_selector
   print(driver.find_element_by_css_selector("div#a").get_attribute("innerHTML").splitlines()[0])

  • 使用 execute_script() :您还可以使用 execute_script() 方法,它可以在当前窗口/框架中同步执行 JavaScript,如下所示:

  • 使用 xpathfirstChild

   parent_element = driver.find_element_by_xpath("//div[@id='a']")
  print(driver.execute_script('return arguments[0].firstChild.textContent;', parent_element).strip())

  • 使用 xpathchildNodes[n]
   parent_element = driver.find_element_by_xpath("//div[@id='a']")
  print(driver.execute_script('return arguments[0].childNodes[1].textContent;', parent_element).strip())

原文由 undetected Selenium 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题