我正在重构RSS,所以我决定用CasperJS编写一些测试。

RSS的元素之一是“ atom:link”(“)

我尝试了这三个代码,但没有一个有效

test.assertExists("//atom:link", "atom:link tag exists.");

test.assertExists({
    type: 'xpath',
    path: "//atom:link"
}, "atom:link element exists.");

//even this...
test.assertExists({
    type: 'xpath',
    namespace: "xmlns:atom",
    path: "//atom:link"
}, "atom:link element exists.");


RSS代码是:

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xml:base="http://example.org/" xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>RSS Title</title>
        <description>RSS description</description>
        <link>http://example.org</link>
        <lastBuildDate>Mon, 10 Nov 2014 11:37:02 +0000</lastBuildDate>
        <language>es-ES</language>
        <atom:link rel="self" href="http://example.org/rss/feed.xml"/>
        <item></item>
        <item></item>
    </channel>
</rss>


我在http://www.freeformatter.com/xpath-tester.html页的演示中看到,可以通过以下方式访问foo:singers:

//foo:singers


但是在CasperJS中似乎这不起作用...

有人知道如何使用命名空间选择这种元素吗?

最佳答案

CasperJS用于通过XPath解析元素的函数是document.evaluate

var xpathResult = document.evaluate(
 xpathExpression,
 contextNode,
 namespaceResolver,
 resultType,
 result
);


当您查看source code时,namespaceResolver始终为null。这意味着CasperJS不能使用带有前缀的XPath。如果尝试,您会得到


  [错误] [远程] findAll():提供了无效的选择器“ xpath选择器:// atom:link”:错误:NAMESPACE_ERR:DOM异常14


您将必须创建自己的方法来使用user defined nsResolver检索元素。

casper.myXpathExists = function(selector){
    return this.evaluate(function(selector){
        function nsResolver(prefix) {
            var ns = {
                'atom' : 'http://www.w3.org/2005/Atom'
            };
            return ns[prefix] || null;
        }
        return !!document.evaluate(selector,
                document,
                nsResolver,
                XPathResult.ANY_TYPE,
                null).iterateNext(); // retrieve first element
    }, selector);
};
// and later
test.assertTrue(casper.myXpathExists("//atom:link"), "atom:link tag exists.");

关于javascript - 如何在CasperJS中选择带有 namespace 的标签?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26931073/

10-12 18:04