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为日常任务提供了许多很好的函数,但是当您需要自定义函数来完成某些任务时,可能会遇到这种情况<代码>评估基本上是要做的

  • 从页面中检索一些值,以便根据脚本中的值采取操作
  • 除了单击或填写表单之外,还可以通过其他方式操纵页面
  • 点1的组合。二,

  • 例子 您可能需要一个通用函数来从复选框中获取选中的
    属性。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节点不是基元,因此失败