我们如何将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();
答案 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();