2015-10-21 3 views
0

Я пытаюсь очистить HTML-ссылки для разных страниц с веб-сайта с использованием CasperJS.Каков правильный способ использования document.querySelectorAll в CapserJS?

В моей адресной строке браузера (Firefox/Chrome) это работает отлично и открывает все ссылки, которые я ищу.

javascript:document.querySelectorAll('a[href^="/page"]').click(); 

Однако, когда я пытаюсь запустить что-то похожее на CasperJS, используя приведенный ниже код, я получаю много ошибок, которые не согласуются с вышеизложенным.

var pageNodes = this.evaluate(function() { 
    return document.querySelectorAll('a[href^="/page"]'); 
}); 

console.log(typeof(pageNodes)); //Shows object 
console.log(pageNodes.length); //Shows 11, which is correct 

var links = []; 

for(var i = 0; i < pageNodes.length; i++) { 
    console.log(i); 
    console.log(pageNodes[i].href); 
    links.push(pageNodes[i].href); 
}; //pageNode[0].href shows the correct link. pageNode[1] is a null for some reason when it shouldn't be! 

Я также пробовал создание прототипа Array на выше, но с теми же результатами! Может ли кто-нибудь помочь мне разобраться, что случилось?

var pageArray = this.evaluate(function(pageNodes) { 
    return Array.prototype.splice(pageNodes, 0); 
}); //Gives the same problem, since pagesNodes[1] is null. 
+0

Вы пропускаете закрывающий парн в строке # 3 – rgthree

+0

К сожалению. Типите, когда набираете вопрос. Проблема все еще остается ... – user2843816

ответ

0

У PhantomJS есть два контекста, и поскольку CasperJS построен поверх него, он имеет такое же ограничение. Это означает, что доступ к контексту страницы изолирован и вы не можете передавать произвольные объекты. documentation говорит это:

Примечание: Аргументы и возвращаемое значение функции evaluate должна быть простой примитивный объект. Эмпирическое правило: если оно может быть сериализовано через JSON, тогда это нормально.

Закрытие, функции, узлы DOM и т. Д. Будет не работа!

Если вы хотите получить доступ к HREF свойства каждой ссылки, то вы должны построил примитивный объект, который может быть передан за пределы или просто распечатать из контекста страницы:

+0

Я пробовал это - преобразовал ее в массив, но все равно не работал! Что мне не хватает? функция getLinks (селектор) {var pageLinks = document.querySelectorAll (селектор); return Array.prototype.map.call (pageLinks, function (e) {return e.getAttribute ('href');}); } casper.then (function() {pages = this.evaluate (getLinks, 'a'); require ('utils'). dump (pages); // страницы все еще null здесь, не знаю почему!}); – user2843816

+0

Убедитесь, что страница загружена, сняв снимок экрана ('casper.capture (filename)'). Также зарегистрируйтесь в событиях ресурса.error, 'page.error',' remote.message' и 'casper.page.onResourceTimeout' ([Пример] (https://gist.github.com/artjomb/4cf43d16ce50d8674fdf # файл-2_caspererrors-JS)). Возможно, есть ошибки. –

Смежные вопросы