2014-11-24 4 views
1

Я использую casperjs и я попал в точку, где у меня есть объект, например, так:Query объект 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')]")); 

Everything иначе это должно быть сделано в контексте страницы. Таким образом, вы можете сделать что-то вроде

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; 
}); 

Нечто подобное можно сделать с помощью clientutils module, но не стоит забывать, что этот модуль может использоваться только внутри контекста страницы.