这是我的PhantomJS测试项目,我在cmd.exe中输入(例如):
>phantomjs.exe abacus.js 1111 222
name: 1111
pass: 222
load started
load finished
jQuery loaded
console> name:
console> pass: undefined
step 0
step 1
done
Abacus.js:
var name, pass;
if (phantom.args.length !== 2) {
console.log('not enough arguments!');
phantom.exit();
} else {
name = phantom.args[0];
pass = phantom.args[1];
}
console.log("name: " + name); //output: "name: MyUsername"
console.log("pass: " + pass); //output: "pass: MyPassword"
var stepIndex = 0;
var page = new WebPage();
var loadInProgress = true;
var jQueryLoad = false;
page.onConsoleMessage = function (msg, line, source) {
console.log('console> ' + msg);
};
page.onAlert = function (msg) {
console.log('alert> ' + msg);
};
page.onLoadStarted = function () {
loadInProgress = true;
console.log("load started");
};
page.onLoadFinished = function () {
loadInProgress = false;
console.log("load finished");
jQueryLoad = page.injectJs("jquery-1.7.1.min.js");
if (jQueryLoad)
console.log('jQuery loaded');
};
var interval = setInterval(function () {
if (jQueryLoad && !loadInProgress && typeof steps[stepIndex] == "function") {
steps[stepIndex]();
page.render("step " + stepIndex + ".png");
console.log("step " + stepIndex++);
}
if (typeof steps[stepIndex] != "function") {
console.log("done");
phantom.exit();
}
}, 1000);
var steps = [
function () {
page.evaluate(function () {
console.log("name: " + this.name); //output: "console> name:"
console.log("pass: " + this.pass); //output: "console> pass: undefined"
var arr = document.frmMain;
if (arr !== null) {
arr.elements["username"].value = "MyUsername"; //Only fils in form if it's a string literal
arr.elements["password"].value = "MyPassword";
} else {
console.log("Could not find frmMain");
}
});
}, function () {
page.evaluate(function () {
document.frmMain.submit();
});
} ];
page.open("http://www.abacusdatagraphics.com/");
page.viewportSize = { width: 1280, height: 1024 };
为什么phantom.args&名字/通行证突然失去了价值。
我在C#中运行cmd.exe,因为名称和密码时不时地更改并保存在数据库中。这只是一个小测试程序,看看是否可以完成。
(另外,感谢Stack Overflow首先为我提供了大部分代码)
答案 0 :(得分:1)
@jlafay
我在this中使用的解决方案是这样的:
PhantomJS无法使用变量填充表单,因为page.evaluate无法处理参数,因此在填写表单时,变量(和表单)为空。
所以我将function()视为字符串并传递如下变量:
page.evaluate('function () {' +
'var theName = ' + name + ';' +
'var thePass = ' + pass + ';' +
'console.log(\"name: \" + this.name);' + //output: "console> name:"
'console.log(\"pass: \" + this.pass);' + //output: "console> pass: undefined"
'var arr = document.frmMain;' +
'if (arr !== null) {' +
' arr.elements["username"].value = theName;' +
' arr.elements["password"].value = thePass;' +
'} else {' +
' console.log("Could not find frmMain");' +
'}' +
'}');
或类似的东西,我不再有代码了。