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

Dav*_*ron 2 javascript scope phantomjs 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);
    });
}); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Art*_* B. 5

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

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

同样重要的是要注意(从这里):

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

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