无法从CasperJS中的thenEvaluate()函数中访问变量

时间:2015-01-19 15:15:51

标签: javascript phantomjs scope casperjs

我最近开始学习CasperJS,我正在尝试登录YouTube。这是我目前的代码:

// XPathSignInButton is predefined
var Username = 'user123';
var Password = 'pass123';

casper.waitForSelector(xPathSignInButton, function() {
    this.thenEvaluate(function() {
        $('#Email').val(Username);
        $('#Passwd').val(Password);
    });
}); 

上面的代码不会操纵输入字段(不会在其中写入),但是如果我用thenEvaluate()替换this.fillSelectors(),则可以正常访问变量并且一切正常:

// XPathSignInButton is predefined
// signInFormSelector is predefined
casper.waitForSelector(xPathSignInButton, function() {
    this.fillSelectors(signInFormSelector, {
        'input[name="Email"]': Username,
        'input[name="Passwd"]': Password
    });
});

我首先想到我调用jQuery的方式存在问题,但是当我用实际字符串替换变量时,例如:$('#Email').val('user123');$('#Email').val('pass123'); - 它就像一个魅力。

我的问题是如何从thenEvaluate()函数中访问变量。它有可能吗?

1 个答案:

答案 0 :(得分:5)

evaluate内部是沙盒页面上下文。你不能使用外部的变量(以及其他方式),你必须明确地传递它们:

casper.thenEvaluate(function(username, password) {
    $('#Email').val(username);
    $('#Passwd').val(password);
}, Username, Password);

同样重要的是要注意(来自here):

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等不起作用!