我正在尝试测试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中做这样的事情.我可以以某种方式将容器的上下文返回给方法,该方法可以将对象返回到主要求值,这可以返回对象的集合吗?
解决方法
不幸的是,你无法从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库.