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

Can't access variables from within the thenEvaluate() function in 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() 函数中访问变量。有可能吗?

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

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

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

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!