使用eval()结果填充CasperJS中的表单

时间:2015-08-01 21:32:52

标签: javascript phantomjs casperjs

我们如何将eval()的值传递给变量以填写密码文本框。

这是我的CasperJS代码。它显示它无法找到变量y

var fs = require('fs');
var casper = require ('casper').create();
var page = require('webpage').create();

casper.start('http://thedemosite.co.uk/login.php', function() {
    this.echo(this.getTitle());
    this.capture('loginbefore.bmp');

    casper.then ( function () {
        casper.evaluate(function(username, password) {
           document.querySelector('#username').value = username;
           document.querySelector('#password').value = password;
           document.querySelector('#FormsButton2').click();
        }, 'PP406214795IN', y));

        casper.then (function () {
            var fs = require('fs');
            var test = fs.read('readingjs.js');
            var y = eval(test);
        });
        this.wait(5000, function() {
            this.echo("I've waited for a  5 second.");
        });
    });
});
casper.run();

1 个答案:

答案 0 :(得分:0)

您的代码存在两个问题。

  • 通过JavaScript中的var关键字定义的变量位于本地函数范围内。它们只能在此函数中定义,并且在此函数中定义闭包。如果要使用全局变量,则需要在全局范围或更高的函数范围内定义它。

  • 所有casper.then*()casper.wait*()都是异步步骤函数。这意味着它们按照您调用它们的顺序依次执行。由于您在定义它之前使用y,因此您需要交换排序,但请记住,casper.evaluate()等所有其他函数都不是异步的,这意味着如果您调用casper.then()casper.evaluate()之前,then()中的代码将在evaluate()代码之后执行。

由于fs.read()eval()是同步函数,因此您可以简单地移动文件读取和eval,如下所示:

casper.start('http://thedemosite.co.uk/login.php', function() {
    this.echo(this.getTitle());
    this.capture('loginbefore.bmp');
});

casper.then(function(){
    var fs = require('fs');
    var test = fs.read('readingjs.js');
    var y = eval(test);

    this.evaluate(function(username, password) {
       document.querySelector('#username').value = username;
       document.querySelector('#password').value = password;
    }, 'PP406214795IN', y);
    this.click('#FormsButton2');
});

casper.then(function(){
    this.capture("loginAfter.png");
});

casper.run();