我们如何将 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();
最佳答案
您的代码有两个问题。
在 JavaScript 中通过
var
关键字定义的变量位于本地函数作用域内。它们只能在此函数和该函数中定义的闭包中访问。如果要使用全局变量,则需要在全局作用域或更高的函数作用域中定义它。所有
casper.then*()
和casper.wait*()
都是异步步骤函数。这意味着它们将按照您调用它们的顺序依次执行。由于您在定义之前使用了 y,因此您需要交换顺序,但请记住,所有其他函数(例如 casper.evaluate())都不是异步的这意味着如果您在casper.evaluate()
之前调用casper.then()
,则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();
关于javascript - 使用 eval() 结果在 CasperJS 中填写表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766450/