How to call a button's onClick() method in PhantomJS?

牧云@^-^@ 提交于 2019-12-08 16:58:30

PhantomJS exits before the work is done.
We need to wait, after the steps is complete.

//
//  Run this script like so:
//
//       phantomjs --cookies-file=cookys.txt example_amazon_login.js 'myemailaddress@gmail.com' 'mypasswordshhhh'
//
//       You may need to execute the script twice so that the cookys.txt file gets data written to it.
//       See http://stackoverflow.com/questions/41391254/not-able-to-get-phantomjs-example-to-work
//


var steps=[];
var testindex = 0;
var loadInProgress = false;//This is set to true when a page is still loading

/*********SETTINGS*********************/
var username = 'unknown';
var password = 'unknown';
var apptitle = 'unknown';
var category = 'Music & Audio';

var webPage = require('webpage');
var page = webPage.create();

/*
page.onResourceRequested = function(request) {
  console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function(response) {
 console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
*/

page.onError = function(msg, trace) {

  var msgStack = ['ERROR: ' + msg];

  if (trace && trace.length) {
    msgStack.push('TRACE:');
    trace.forEach(function(t) {
      msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
    });
  }

  console.error(msgStack.join('\n'));

};

page.settings.userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36';
page.settings.javascriptEnabled = true;
page.settings.loadImages = false;//Script is much faster with this field set to false
phantom.cookiesEnabled = true;
phantom.javascriptEnabled = true;
/*********SETTINGS END*****************/


/* Get command line args user password*/
var system = require('system');
var args = system.args;
var initial_url = 'https://developer.amazon.com/login.html';

if (args.length === 1) {
  console.log('Try to pass some arguments when invoking this script!');
} else {
  args.forEach(function(arg, i) {
    console.log(i + ': ' + arg);
    if ( i === 1 ) { username = arg; }
    if ( i === 2 ) { password = arg; }
    if ( i === 3 ) { apptitle = arg; }
  });
}

if ( username == 'unknown' ) {
        console.log('Please specify username and password');
        phantom.exit();
}
if ( password == 'unknown' ) {
        console.log('Please specify username and password');
        phantom.exit();
}
if ( apptitle == 'unknown' ) {
        console.log('Please specify apptitle');
        phantom.exit();
}


console.log('All settings loaded, start with execution');
page.onConsoleMessage = function(msg) {
    console.log(msg);
};
/**********DEFINE STEPS THAT FANTOM SHOULD DO***********************/
steps = [

        /*
         * Step 1 - Open Amazon home page
         */
        function(){
                console.log('Step 1 - Open Amazon home page ' + initial_url);
                // page.open("https://developer.amazon.com/home.html", function(status) {
                page.open( initial_url, function(status) {
                        console.log('status is '+ status );
                });
        },

        /*
         * Step 2 - Populate and submit the login form
         */
        function(username,password){
                console.log('Step 2 - Populate and submit the login form');
                // var appActionToken = page.evaluate(function() { return $('input[name="appActionToken"]').attr('value'); });
                // console.log( 'appActionToken is ' + appActionToken );
                console.log( 'username is ' + username );
                console.log( 'password is ' + password );
                page.evaluate(function(username,password){
                        console.log( '  username is ' + username );
                        console.log( '  password is ' + password );
                        document.getElementById("ap_email").value=username;
                        document.getElementById("ap_password").value=password;
                        document.getElementById("ap_signin_form").submit();
                },username, password);
        },
        /*
         * Step 3 Click the add_new_app button
         */
        function(){
                console.log('Step 3 - Click on the add_new_app button');
                page.evaluate(function(){
                        var evnt = document.createEvent("MouseEvents");
                        evnt.initEvent("click",true,true);
                        document.getElementById("add_new_app_link").dispatchEvent(evnt);

                });
                //page.render('step3.png');
        },

        /*
         * Step 4 - Populate and submit the First App submission vorm
         *
         * <input id="submit_button" type="submit" class="button large primary one-click-submit" name="save" value="Save" onclick="sanitizeManifestURL()">
         *
         * try looking here:
         * http://stackoverflow.com/questions/32771609/how-to-click-on-selectbox-options-using-phantomjs
         *
         */
        function(apptitle,category){
                console.log('Step 4 - save app ' + apptitle);
                page.evaluate(function(apptitle,category){
                        document.getElementById('title').value=apptitle;
                        // this works
                       document.querySelector('select').selectedIndex = 16;
                        $('select[lvl="1"]').change();
                        //document.querySelector('select[lvl="2"]').selectedIndex = 1;
                        //$('select[lvl="2"]').change();

                        //The form will be submitted, by click on the button:
                        $('#submit_button').click();
                   },apptitle,category);

                        page.render('step4.png');
//                      console.log(page.content);
        },
];

/**********END STEPS THAT FANTOM SHOULD DO***********************/

//Execute steps one by one
interval = setInterval(executeRequestsStepByStep,50);

function executeRequestsStepByStep(){
    if (loadInProgress == false && typeof steps[testindex] == "function") {
        console.log("testindex is " + testindex );
        if ( testindex == 1 ) {
                console.log( "username is " + username );
                steps[testindex](username, password);
        } else if ( testindex == 3 ) {
                steps[testindex](apptitle, category);
        } else {
            steps[testindex]();
        }
        testindex++;
    }
    if (typeof steps[testindex] != "function") {
  //We need to wait, after the steps is complete!
   clearInterval(interval);interval=0;
   setTimeout(function(){
   console.log("test complete!");
   page.render('complete.png');
   setTimeout(phantom.exit,2000)
   },3000);

    }
}

/**
 * These listeners are very important in order to phantom work properly.
 * Using these listeners, we control loadInProgress marker which controls, weather a page is fully loaded.
 * Without this, we will get content of the page, even a page is not fully loaded.
 */
page.onLoadStarted = function() {
    loadInProgress = true;
    console.log('Loading started');
};
page.onLoadFinished = function() {
    loadInProgress = false;
    console.log('Loading finished');
};
page.onConsoleMessage = function(msg) {
    console.log(msg);
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!