了解Casperj中的评估功能[英] Understanding the evaluate function in CasperJS

问题描述

我想了解在哪种情况下或必须使用evaluate函数.

我已经阅读了有关casperjs的evaluate函数的API文档,但是我不确定在这种情况下,我应该使用此功能. DOM上下文是什么意思?有人可以提供一个例子吗?

推荐答案

casperjs文档对 casper.evaluate() casper.evaluate() casper.evaluate() casper.evaluate() casper.evaluate() /a>做.

回顾:您传递了将在DOM上下文中执行的函数(您还可以将其称为页面上下文).您可以将一些原语作为参数传递给此功能,并返回一个原始返回.请记住,您传递给evaluate的功能必须是自我包含的.它不能使用此功能之外定义的变量或函数.


casperjs为日常任务提供了许多好的功能,但是当您需要自定义功能做某事时,您可能会遇到一种情况. evaluate基本上要做

  1. 从页面中检索一些值以根据脚本采取行动
  2. 除了单击或填写表格外,以某种方式操纵页面
  3. 点1.和2.
  4. 的组合

示例

您可能需要一个通用功能才能从复选框中获取checked属性. Casperjs当前仅提供getElementAttribute函数,在这种情况下将不起作用.

function getChecked(cssSelector){
    return document.querySelector(cssSelector).checked;
}

if (casper.evaluate(getChecked, selector)){
    // do something
} else {
    // do something else
}

在大多数情况下,这只是您要使用的内容的偏爱.如果您在每个li元素上都有data-uid的用户列表,则至少有2种检索UID的可能性.

casper-仅:

var uids = casper.getElementsAttribute('ul#user-list > li', 'data-uid');

casper-evaluate:

var uids = casper.evaluate(function(){
    return Array.prototype.map.call(document.querySelectorAll('ul#user-list > li'), function(li){ return li["data-uid"]});
});

关于操纵,一切皆有可能,但取决于您想做什么.假设您想拍摄网页的屏幕截图,但是您不想在那里进行一些元素.或者您可以将自己的CSS添加到文档中.

删除元素:

function removeSelector(cssSelector){
    var elements = document.querySelectorAll(cssSelector);
    Array.prototype.forEach.call(elements, function(el){
        el.parent.removeChild(el);
    });
}
casper.evaluate(removeSelector, '.ad'); // if it would be that easy :)

通过CSS更改站点外观:

function applyCSS(yourCss){
    var style = document.createElement("style");
    style.innerHTML = yourCss;
    document.head.appendChild(style);
}
casper.evaluate(applyCSS, 'body { background-color: black; }'); // non-sense

casperjs建立在phantomjs的顶部,因此继承了其一些怪癖. page.evaluate() 的phantomjs文档

注意:参数和对evaluate函数的返回值必须是一个简单的原始对象.经验法则:如果可以通过JSON序列化,则很好.

封闭,功能,dom节点等将 工作!

本文地址:https://www.itbaoku.cn/post/1739816.html