Phantomjs 理解CasperJS中的求值函数
我想了解在何种情况下,我应该或必须使用Phantomjs 理解CasperJS中的求值函数,phantomjs,casperjs,Phantomjs,Casperjs,我想了解在何种情况下,我应该或必须使用evaluate功能 我已经阅读了有关CasperJS的evaluate函数的API文档,但我不确定在哪种情况下应该使用该函数。DOM上下文是什么意思?有人能提供一个例子吗?CasperJS文档很好地描述了它的作用 重述一下:您传递了一个将在DOM上下文中执行的函数(您也可以称之为页面上下文)。您可以将一些原语作为参数传递到此函数,然后返回一个原语。请记住,传递给evaluate的函数必须是自包含的。它不能使用在此函数之外定义的变量或函数 CasperJS
evaluate
功能
我已经阅读了有关CasperJS的
evaluate
函数的API文档,但我不确定在哪种情况下应该使用该函数。DOM上下文是什么意思?有人能提供一个例子吗?CasperJS文档很好地描述了它的作用
重述一下:您传递了一个将在DOM上下文中执行的函数(您也可以称之为页面上下文)。您可以将一些原语作为参数传递到此函数,然后返回一个原语。请记住,传递给evaluate
的函数必须是自包含的。它不能使用在此函数之外定义的变量或函数
CasperJS为日常任务提供了许多很好的函数,但是当您需要自定义函数来完成某些任务时,可能会遇到这种情况<代码>评估基本上是要做的
例子 您可能需要一个通用函数来从复选框中获取选中的
属性。CasperJS目前只提供getElementAttribute
函数,在这种情况下不起作用
函数getChecked(cssSelector){
返回单据。查询选择器(cssSelector)。已选中;
}
if(casper.evaluate(getChecked,选择器)){
//做点什么
}否则{
//做点别的
}
在大多数情况下,它只是您想要使用的首选项。如果在每个li
元素上都有一个用户列表,其中包含数据uid
,则至少有两种可能检索uid
仅限卡斯珀:
var uids=casper.getElementsAttribute('ul#user list>li','data uid');
卡斯珀评价:
var uids=casper.evaluate(函数(){
return Array.prototype.map.call(document.queryselectoral('ul#user list>li'),函数(li){return li[“data uid”]});
});
关于操纵,一切都是可能的,但取决于你想做什么。假设你想拍摄网页截图,但有些元素你不想出现在那里。或者您可以将自己的CSS添加到文档中
删除元素:
函数移除选择器(cssSelector){
var元素=document.queryselectoral(cssSelector);
Array.prototype.forEach.call(元素、函数(el){
el.父母离开子女(el);
});
}
casper.evaluate(删除选择器'.ad');//如果有那么简单:)
通过CSS更改网站外观:
函数applyCSS(yourCss){
var style=document.createElement(“样式”);
style.innerHTML=yourCss;
document.head.appendChild(样式);
}
evaluate(applyCSS,'body{background color:black;}');//无意义
根
CasperJS构建在PhantomJS之上,因此继承了它的一些怪癖。PhantomJS的文档说明了这一点:
注意:参数和evaluate
函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了
闭包、函数、DOM节点等将无法工作强>
文档中哪里说Casper.eval()只返回一个原语?试图返回一个对象时,由于无法弄清楚这一点而浪费了很多时间。@nikkwong All函数只返回一个对象。该对象可能是包含许多对象的实际数组。唯一的问题是,所有这些都必须是可序列化的。很抱歉,我来晚了一点,但是@ArtjomB.,你是说evaluate可以返回数组对象吗?因为我遇到了一个错误,我不知道为什么。@Q.H.是的,您可以返回基本数组。我见过。看来你还没有读到我答案的最后一部分。DOM节点不是基元,因此失败