如何让 Chrome 加载 XML raw?

How to get Chrome to load XML raw?

我正在尝试在 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 中检索一个值(在本例中,我们说 <Bar> 的内容),并且我使用 By.xpath("//Bar") 的定位器时,它会抛出没有这样的元素。

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

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

输出:

html
head
body
pre

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

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

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

如果您的测试过去工作正常,那么可能是服务器以前用来设置这样的 header,现在却没有。您必须决定这是否是缺陷。

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