【问题标题】:text content located in second br tag can't be printed无法打印位于第二个 br 标记中的文本内容
【发布时间】:2020-12-18 06:51:58
【问题描述】:

我正在尝试按照 xpath 打印位于第二个 br 标记中的文本内容,但所有 br 标记中的所有文本都打印在控制台中。可能是什么原因?

driver.findElement(By.xpath("//*[text()[contains(.,'Telefon')]]")).getText();

【问题讨论】:

  • 如果您检查页面,您只需右键单击元素并复制 xpath 并在它不在 iframe 下时使用。 h2/br[2] 应该是最有可能的 xpath。

标签: java html selenium xpath automated-tests


【解决方案1】:

driver.findElement() 函数返回具有给定 Xpath 的所有元素。要仅获取 selenium 中的一个元素,您可以使用 driver.find_element_by_xpath(fxp) 函数,其中 'fxp' 是给定元素的完整 XPath

【讨论】:

  • 驱动中似乎没有find_element_by_xpath这样的方法
  • 您可以查看geeksforgeeks.org/… 了解更多信息。
【解决方案2】:

尝试将您的 xpath 表达式更改为

//h2/br/following-sibling::text()[contains(.,'Telefon')]

看看它是否有效。

【讨论】:

  • 谢谢,但出现此错误; org.openqa.selenium.InvalidSelectorException。 xpath 表达式“//h2/br/following-sibling::text()[contains(.,'Telefon')]”的结果是:[object]。它应该是一个元素。
【解决方案3】:

获取不到文字的原因是文字不在br标签中。

<打开br标签/>关闭

此外,如果您read a bit more about it,即使/> 也超出了要求。如果您只有<br>,则文本不会包含在其中,因为:

<br> 标签是一个空标签,这意味着它没有结束标签。

重点是,您的所有文本都是 h2。你需要尽你所能来处理它。

要解决您的问题,您需要:

  • .getAttribute("innerHTML") - 这将为您提供带有 br 标签的 h2 的所有文本
  • 在字符串<br> 上拆分您的字符串(请注意,在 chrome 中,我的 <br /> 变为 <br> - 您可能需要对此进行调整)李>
  • 选择 item[2] 或执行 lamda 以选择包含您的文本的项目(选择您觉得更舒服的项目)

这些步骤如下所示:

        //Get the element, 
        var h2Element = driver.findElement(By.xpath("//*[text()[contains(.,'Telefon')]]"));
        var myTextArray = h2Element.getAttribute("innerHTML").split("<br>");

        //approach 1 - just print the [1] item
        var approach1Text = myTextArray[2];
        System.out.println(approach1Text);

        //aproach 2 - use a lamda to select by contains
        var approach2Text = Arrays.stream(myTextArray).filter(a -> a.contains("Telefon")).findFirst().get();
        System.out.println(approach2Text);

额外说明 - 你可能很高兴让你的 xpath 工作,因为br 标签将文本分成单独的元素。结果,您的 h2 实际上有多个 text() 值。它有 text()text()[2]text()[3] 等 - 与 brs 一样多

我整理了一个简单的页面来为您测试 - 只是为了向您展示发生了什么:(注意开发工具中的 xpath)

这是text()[3],因为 xpath 的索引是从 1 开始的(与上面从 0 开始的 java 代码比较)。然而 - 这只是为什么它很棘手的一个例子,我不建议你这样做

消除&lt;br&gt;(和其他标签!)对文本的影响的简单方法是使用normalize-space()

这样的 xpath 很有效,而且非常容易遵循。

//h2[contains(normalize-space(),'Telefon')]

映射到我的示例页面确定:

如果你有更多的文本分割对象,我会分享这个额外的内容,它可以帮助你。

...所有这一切 - 让您的原始 xpath 工作做得很好。那也不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2013-05-31
    相关资源
    最近更新 更多