【问题标题】:How to get Chrome to load XML raw?如何让 Chrome 加载 XML 原始文件?
【发布时间】:2020-09-22 21:02:41
【问题描述】:

我正在尝试在 Chrome 中加载原始 XML url,并使用 XPath 搜索生成的 XML。 (这是 Selenium 作为测试的一部分。)

我很确定这在以前有效,但目前,当我将浏览器定向到 XML URL 时,它不是转储 XML 原始文件,而是将其包装在一些 HTML 中。

如果我在 Chrome 中加载 URL,它会显示得很好,是原始文本。如果我在“预览”或“响应”选项卡中查看“网络”,我会看到有效负载中仅发送了原始 XML。

我的期望是:

<Foo xmlns="some.site.com">
<Bar>123456</Bar><Thingy>1</Thingy><Widget>4420.00</Widget><Hooby>29.00</Hooby>
</Foo>

但是,当我打开 Inspector 时,我得到:

<html>
    <head/>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;">
            &lt;Foo xmlns="some.site.com"&gt;
            &lt;Bar&gt;123456&lt;/Bar&gt;&lt;Thingy&gt;1&lt;/Thingy&gt;&lt;Widget&gt;4420.00&lt;/Widget&gt;&lt;Hooby&gt;29.00&lt;/Hooby&gt;
            &lt;/Foo&gt;</pre>
    </body>
</html>

因此,当我尝试从 XML 中检索一个值(在本例中假设为 &lt;Bar&gt; 的内容),并且我使用 By.xpath("//Bar") 的定位器时,它会抛出 No such Element。

编辑:我通过迭代匹配“//*”的元素验证了这也是 Selenium 所看到的。

for (WebElement e : driver.findElements(By.xpath("//*"))) {
    System.out.println(e.getTagName());
}

输出:

html
head
body
pre

如何让 Chrome 仅将 XML 呈现为 XML 而不是将其包装在 HTML 中?

我真的很确定这以前有效。

【问题讨论】:

  • 请注意,这里的 xml 是希腊化的,而 xmlns 的 url 是捏造的 b/c 所以即使是假 url,我也不会让我发帖。所以这些不是这里的相关问题。
  • 我的建议是使用 selenium 获取页面源并自己解析或使用 xml 解析库。我知道 python 有driver.page_source,不确定您使用的是哪种语言。似乎比尝试将插件加载到自动 chromedriver 会话中更简单。
  • 我担心 selenium 的 get-source 函数会返回 Chrome 修改后的 HTML,如 Inspector 中所示。我最终确实最终直接从 JAVA 访问了 url,然后进行了 XML 解析。好像没必要……
  • 但是,我仍然可以看到我不希望 Chrome 将原始数据隐式包装在 HTML 中的场景。

标签: xml selenium google-chrome xpath render


【解决方案1】:

浏览器通常会根据响应的 Content-Type 标头值来决定如何呈现响应。对于 XML,它必须是 application/xml

如果您的测试过去可以正常工作,那么可能是服务器之前设置了此类标头,而现在却没有。您必须确定这是否是缺陷。

一种可能的解决方法是使用代理,该代理会将此标头设置为代表您的 XML 内容的 URL 的所有响应。

【讨论】:

  • 你说得对,它是作为内容类型文本/纯文本传递的......啊......这不是我可以控制的网站,而且我可能是唯一关心的人不匹配
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多