2014-11-14 68 views
0

我在重构一个RSS,所以我决定用CasperJS写一些测试。如何在CasperJS中选择带有名称空间的标签?

其中一个RSS的元素是 “原子:链接”(“)

我想这三个码,但没有工作

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:歌手可以通过:

//foo:singers 

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

任何人都知道如何选择这种类型的元素与命名空间?

回答

2

其CasperJS使用由XPath来解决元素的功能是document.evaluate

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

当你看看source codenamespaceResolver总是null。这意味着CasperJS不能使用带有前缀的XPath。如果你尝试,你会得到

[error] [remote] findAll(): invalid selector provided "xpath selector: //atom:link":Error: NAMESPACE_ERR: DOM Exception 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."); 
+0

你当然可以尝试通过解析文档中嵌入的名称空间来优化。 – 2014-11-14 17:05:28

+0

它的工作真的很棒。复制粘贴。谢谢Artjom。 – 2014-11-17 08:12:30

相关问题