我正在尝试测试CasperJS,并正在抓取一个网格布局如下的网站:
|Name |Name |
|Title |Title |
|Image |Image |
|Something |Something |
|----------------------
|Name |Name |
|Title |Title |
|Image |Image |
|Something |Something |
|----------------------
如果我没有使用CasperJS,我会检索所有包含的列表(本例中为4),然后在每个容器上运行一个方法,该方法可以检索具有所需属性的对象。
我似乎很难在CasperJS中这样做。首先,我尝试在casper.evaluate(function(){....})中返回DOM元素列表,但它不能返回DOM元素。
然后我尝试创建一个每个循环,它将所需对象(4)推送到一个数组并将其返回到Evalue中,但它会一直返回null。
如何在CasperJS中做这样的事情。我可以以某种方式将容器的上下文返回给方法,该方法可以将对象返回到主要求值,这可以返回对象的集合吗?
答案 0 :(得分:9)
不幸的是,您无法从evaluate()
函数获得复杂的结构,因为从evaluate()
传递的任何arg都是JSON.parse(JSON.stringify(arg))
。
但这并不意味着你无法传递其他类型的物品。
这是一个关于如何从casper.evaluate()
获取包含对象的数组的示例:
var arrayResult = this.evaluate(function getGridResuls(){
//create array
var arrayObjects = new Array();
//Iterates over table (grid) elements
jQuery("table.results").each(function( index ) {
//get table (grid)
var tableResult = jQuery(this);
//create basic object
objResult = new Object();
//fill object properties
objResult.name = tableResult.find('selector to get name').text();
objResult.title = tableResult.find('selector to get title').text();
objResult.image = tableResult.find('selector to get image info').text();
objResult.something = tableResult.find('selectot to get something').text().trim();
//assign object to array
arrayObjects[index] = objResult;
});
//return array with objects
return arrayObjects;
});
...
//do something with arrayResult
我假设Web上下文包含JQuery库。
提示:尝试使用浏览器控制台运行evaluate()
函数的js代码,以确保您的js代码按预期工作。
答案 1 :(得分:2)
方法是正确的,但评估是沙箱。另外,evaluate函数的参数和返回值必须是一个简单的原始对象,但如果它可以通过JSON序列化,那么它很好。闭包,函数,DOM节点等不起作用!
使用JSON.stringify()