在casper.evaluate()中使用casper功能[英] Use casper function inside casper.evaluate()

问题描述

是否可以在casper.evaluate()中使用jQuery代码内部使用Casper函数?我需要以类似于jQuery的方式来获取iterare元素.

我正在加载jquery.js lib

这是我的尝试脚本:

casper.evaluate(function(){
    $('#size-modal .size-panel-title a').each(function(){
        $(this).click();    
        accordionTab = $(this).attr('href');
        casper.capture(screenShotOutput + "PDP-" + accordionTab +".png");
    });
});

在此页面中有2个手风琴,我想要每个打开的手风琴的屏幕截图. 它似乎有效,但没有给出反馈,并且在第一次捕获()迭代中退出表单evaluith(). 测试通过而无需制作屏幕截图.

如果我添加evaliate()

casper.capture(screenShotOutput + "PDP-accordion.png");

并评论evaluate()内的捕获(),我可以看到之前的代码运行良好,制作了屏幕截图并打开每个手风琴.

问题是Casper使用JavaScript选择器,因此,如果我仅指定

casper.click('#size-modal .size-panel-title a');
casper.capture(screenShotOutput + "PDP-" + accordionTab +".png");

不使用casper.evaluate()只能打开一个手风琴.

谢谢

推荐答案

您在" casper.evaluate"中所做的事情是类似的,在浏览器的控制台中编写同一件代码.考虑一下,您会知道自己犯了什么错误.

  1. " casper.capture"是一种特定的语法,没有浏览器理解.

这也是Doc的

的参考

这种方法背后的概念可能是发现Casperjs时最难理解的.提醒您,想想

evaloutation()方法作为Casperjs环境与您打开的页面之一之间的门;

每次通过闭合来essuation(),您都在输入页面并执行代码,就好像在使用浏览器控制台一样.

我希望图片可能会有所帮助:

评估,它与浏览器互动的方式

我同意@artjom B.的建议.

其他推荐答案

casper.evaluate()是沙盒页面上下文.它无法访问casper或其他定义的变量.

有两种解决这个问题的可能性.

在页面上下文外移动循环

var a = '#size-modal .size-panel-title a';
var len = casper.getElementsInfo(a).length;
for(var i = 0; i < len; i++) {
    casper.evaluate(function(i, a){
        var el = $($(a)[i]);
        el.click();    
        return el.attr('href');
    }, i, a);
    casper.capture(screenShotOutput + "PDP-" + accordionTab +".png");
}

触发从页面上下文捕获

有phantomjs函数 callPhantom 要从页面上下文触发外部事件:

casper.page.onCallback = function(data){
    casper.capture(screenShotOutput + "PDP-" + data +".png");
};
casper.evaluate(function(){
    $('#size-modal .size-panel-title a').each(function(){
        $(this).click();
        window.callPhantom($(this).attr('href'));
    });
});

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