casperJS无法找到变量:$

时间:2013-09-29 10:07:07

标签: module casperjs evaluate

我正在尝试使用this.evaluate()调用另一个模块中定义的函数。

代码片段(调用函数)是:

this.waitFor(function check() {
    var re = this.evaluate(universe.answer(couponElement, url));
    if (re != 'no' & re!='yes' & re!=null) {
        couponObj.push(re);

和定义函数的模块是这样的:

var require = patchRequire(require);

var utils = require('utils');
exports.answer = function(couponElement, url) {
    var lblInvalidCoupon = 'lblInvalidCoupon';
    var tolTipCouponinner='tolTipCouponinner';
    var txtFCCoupondisocunt = 'txtFCCoupondisocunt';
    var btnRemoveFCCoupon = 'btnRemoveFCCoupon';

    var check = $('#txtCouponCode').css('backgroundImage');
    if (check.indexOf('ajax-loader.gif')>-1){        
        return 'no';
    } else {
        if (document.getElementById(lblInvalidCoupon)!=null){

基本上,我想使用this.evaluate调用该函数,但无法这样做。

2 个答案:

答案 0 :(得分:0)

首先,尝试使用最简单的evaluateremote.message事件从页面中捕获console.log

casper.on("remote.message", function(msg) { 
    console.log("[page] " + msg); 
});

this.evaluate(function () { 
    console.log("Hi phantomworld! I am hello-ing from remote page!"); 
});

接下来,检查jQuery是否存在:

this.evaluate(function () { 
    console.log(typeof jQuery); 
});

如果是,[page] function,则jQuery 出现在页面中。你需要挖掘更多...

如果没有,请注入:

var casper = require('casper').create({
    clientScripts:  [
        'includes/jquery.js'
    ]
});     

答案 1 :(得分:-3)

您实际上并未将answer函数传递给casper.evaluate,而是将其调用。问题是以这种方式answer没有在页面上下文中执行,因此没有定义$。在页面上下文中执行函数的casper.evaluate是沙箱。它不能使用外部定义的变量。传递的函数必须是自包含的。

要解决这个问题,answer使用的参数可以作为附加参数传递给casper.evaluate

更改行

var re = this.evaluate(universe.answer(couponElement, url));

var re = this.evaluate(universe.answer, couponElement, url);

如果页面中没有JQuery,您需要关注sudipto's answer