[英]Using an eval() result to fill a form in 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();
您的代碼有兩個問題。
通過JavaScript中的var
關鍵字定義的變量在本地函數范圍內。 它們只能在此函數中訪問,並且只能在此函數中定義閉包。 如果要使用全局變量,則需要在全局范圍或更高功能范圍中定義它。
所有casper.then*()
和casper.wait*()
都是異步步驟函數。 這意味着它們將按照您調用它們的順序一個接一個地執行。 由於在定義y
之前使用y
,因此需要交換順序,但請記住,所有其他函數(例如casper.evaluate()
都不異步,這意味着如果在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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.