2014-11-24 61 views
1

我使用casperjs,我到了一個地步,我有這樣一個對象,以便:查詢一個getElementInfo對象CasperJS

var domElem = this.getElementInfo(".foo"); 

,現在我想查詢domElem進一步上,像這樣:

var domElemChild = domElem.QUERYFUNCTIONHERE(".bar"); 

我不能這樣做,因爲domElem是一個對象,而不是一個DOM節點,我能做些什麼(最好)只有casperjs?

注:我嘗試使用cheerio但它在努力要求其輸出以下錯誤:

Error: Cannot find module 'util'
D:/dev/myproj/phantomjs:/bootstrap.js:289
D:/dev/myproj/phantomjs:/bootstrap.js:254 in require
D:/dev/myproj/node_modules/cheerio/node_modules/htmlparser2/lib/Pars er.js:120
D:/dev/myproj/node_modules/cheerio/node_modules/htmlparser2/lib/Pars er.js:351 Unsafe JavaScript attempt to access frame with URL about:blank from frame with U RL file:///d:/casperjs/bin/bootstrap.js. Domains, protocols and ports must match

回答

2

有這取決於你想與domElem做多的可能性。

最簡單的可能是串聯的CSS選擇:

var domElemChild = this.getElementInfo(".foo .bar"); 

由於CSS路徑可能會返回根據原稿的意想不到的效果,下面的XPath會工作打算:

var domElemChild = this.getElementInfo(x("(//*[contains(@class,'foo')])[1]//*[contains(@class,'bar')]")); 

一切否則必須在頁面上下文中完成。所以,你可以這樣做類似的可以使用clientutils module完成

var text = this.evaluate(function(){ 
    var domElem = document.querySelector(".foo"); 
    window._someDomElement = domElem; // save for later 
    // DOM nodes cannot be passed out of the page context, so return the innerHTML 
    return domElem.innerHTML; 
}); 
// do something with `text` 
var text = this.evaluate(function(){ 
    var domElemChild = window._someDomElement.querySelector(".bar"); 
    return domElemChild.innerHTML; 
}); 

的東西,但不要忘了,這個模塊只能在頁面上下文的內部使用。