【问题标题】:How do I get all child nodes of an element , including text ones, in Selenium WebElement?如何在 Selenium WebElement 中获取元素的所有子节点,包括文本节点?
【发布时间】:2022-01-31 00:12:40
【问题描述】:

我必须在 Java Selenium 应用程序中解析这个元素:

<span class="text-small-teaser d-none d-sm-inline-block cut-job-address swissdev-grey-text">
    <span class="icon-building mr-1" aria-hidden="true"></span>
    <span class="mr-3">Altex Romania </span>
    <span class="icon-map-marker mr-1" aria-hidden="true"></span> 
    Global City Business Park, Bucharest  
    <span class="green-text"> + Remote</span>        
</span>

我想得到一个包含所有 5 个孩子的列表,包括文本之一。 当我使用 WebElement 中的任何选择器时,无论是 xpath、cssSelector,它只会返回 4 个非文本元素。 有谁知道这是怎么做到的吗?我是 Selenium 的新手,我以前没有使用过它。谢谢。

【问题讨论】:

  • 您的意思是您无法提取此文本节点Global City Business Park, Bucharest 吗?
  • 是的,我认为这很明显......

标签: java html selenium


【解决方案1】:

Global City Business Park, Bucharest 与其他 4 个 span 节点一样,不是父节点 span 的子节点。
此文本值是父节点本身的文本。
因此,例如,如果您想提取第二个子元素 Altex Romania 的文本,您将能够像这样使用 XPath 定位第二个子元素

"//span[contains(@class,'cut-job-address')]//span[@class='mr-3']"

然后从 WebElement 对象中提取文本。
但是要提取Global City Business Park, Bucharest,您必须从父元素本身提取文本,如下所示:

WebElement element = driver.findElement(By.xpath("//span[contains(@class,'cut-job-address')]"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
String parentStringOnly = jse.executeScript("""
    return jQuery(arguments[0]).contents().filter(function() {
        return this.nodeType == Node.TEXT_NODE;
    }).text();
    """, element);

【讨论】:

  • 这不是 OP 所要求的,请参阅此行 I want to get a list with all its 5 children, including the text one,您的答案更多是关于文本提取。他是对的,有 5 个子节点,但是其中一个是文本节点而不是基于标签的节点。
  • 正如我在回答中所描述的,那里不是 5 个子元素。只有4个子元素,而文本不是父节点内部的节点,它是父节点本身的文本属性值。我还添加了如何在没有子元素文本的情况下提取该文本的解决方案
  • 我在 Selenium 之前使用了 Jsoup,但这并没有发生在那里,文本节点也被认为是子节点,并由 childNodes() 或 children() 方法返回......为什么不是这种情况硒?
  • @user17693777 这不是 Selenium,它是 XML。我不知道您在说什么 XML 结构,但在这里我清楚地看到父节点内有 4 个节点,而不是 5 个子节点。文本不是子节点,它是节点本身的一个属性。
  • 好的,我同意这一点
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 2020-06-21
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多