2014-11-14 65 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

相關問題