代码:
var array = casper.evaluate(function () {
var nodes = document.querySelectorAll('#J_bought_main > div > div:nth-child(4) > div:nth-child(3) > div > div');
return Array.prototype.map.call(nodes, function extractOrder(x) {
var textNode = x.querySelector('table:nth-child(2) > tbody > tr:nth-child(2) > td:nth-child(5) > div > p:nth-child(2)');
var urlNode = x.querySelector('table:nth-child(2) > tbody > tr:nth-child(2) > td:nth-child(6) > div > div:nth-child(2) > div:nth-child(1) > span > a');
return {
'text': textNode != null ? textNode.textContent : "",
'url': urlNode != null ? urlNode['href'] : ""
};
});
});
casper.echo(array.length);
当我执行时,它始终以TypeError: null is not an object (evaluating 'array.length')
失败。
评估返回的数组似乎是null
,但是当我在Chrome控制台中执行相同的脚本时,它会给出正确的结果:
(有一些汉字,但没关系)
那么为什么相同的代码在Chrome中成功但在我的CasperJS评估中失败?怎么写一个正确的?
任何建议都将受到赞赏。
来自doc:
这种方法背后的概念可能是最难的 在发现CasperJS时了解。提醒一下,想一想 evaluate()方法作为CasperJS环境和之间的门 你打开的一个页面;每次你把关闭传递给 evaluate(),您正在进入页面并执行代码,就像您一样 使用浏览器控制台。
如果它在Chrome控制台中取得成功,它会声称它会在我的evaluate
CasperJS中成功...