Question

Voici mon projet de test PhantoMJS que j'exécute dans cmd.exe en tapant (par exemple):

>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 };

Toute aide serait appréciée pour expliquer pourquoi Phantom.args & Name / Pass perdent soudainement leurs valeurs.

J'exécute cmd.exe en C # car le nom et le mot de passe changent de temps en temps et je suis conservé dans une base de données. Il s'agit simplement d'un petit programme de test pour voir si cela peut être fait.

(Aussi, grâce à Stack Overflow pour m'avoir donné la majeure partie de ce code en premier lieu)

Était-ce utile?

La solution

@jlafay

La solution que j'ai utilisée cette est comme tel:

Phantomjs n'a pas pu remplir les formulaires avec des variables car Page.Evaluate ne peut pas gérer les paramètres, donc lors du remplissage du formulaire, les variables (et les formulaires) sont nulles.

Au lieu de cela, j'ai traité Function () comme une chaîne et passé les variables comme ceci:

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");' +
    '}' +
'}');

Ou quelque chose comme ça, je n'ai plus le code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top