Запрос объекта getElementInfo в CasperJS

Я использую casperjs, и я дошел до того, что у меня есть такой объект:

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

И теперь я хочу запросить domElem дальше, например:

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

Я не могу этого сделать, потому что domElem — это объект, а не DOM-узел, что я могу сделать, используя (предпочтительно) только casperjs?

Примечание. Я пытался использовать cheerio, но при попытке потребовать его выдал следующую ошибку:

Ошибка: не удается найти модуль 'util'
D:/dev/myproj/phantomjs:/bootstrap.js:289
D:/dev/myproj/phantomjs:/bootstrap.js:254 в 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 Небезопасный JavaScript попытаться получить доступ к фрейму с URL-адресом about:blank из фрейма с URL-адресом U-файла:///d:/casperjs/bin/bootstrap.js. Домены, протоколы и порты должны совпадать


person funerr    schedule 24.11.2014    source источник


Ответы (1)


Есть много возможностей в зависимости от того, что вы хотите сделать с domElem.

Самым простым может быть объединение селекторов CSS:

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

Поскольку путь CSS может возвращать неожиданные результаты в зависимости от вашего документа, следующий XPath будет работать так, как задумано:

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

Все остальное должно быть сделано в контексте страницы. Итак, вы можете сделать что-то вроде

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, но не забывайте что этот модуль можно использовать только внутри контекста страницы.

person Artjom B.    schedule 24.11.2014