如何在PhantomJS中调用按钮的onClick()方法?

时间:2017-01-10 05:40:10

标签: javascript phantomjs

这不是重复。我查看了PhantomJS; click an element中的答案,并且OP说答案是调用分配给需要的元素的“onClick()”方法被点击,但OP没有说他们如何完成这个。也没有接受的答案。

我正在尝试使用PhantonJS脚本自动将Android应用程序提交到亚马逊的App商店。到目前为止我已经完成了这些步骤:

  1. 打开开发者控制台网址:https://developer.amazon.com/login.html
  2. 登录我的开发者帐户
  3. 点击add_new_app_link
  4. 填充First App提交表单,然后调用此元素上定义的onclick方法:

    <输入id =“submit_button”type =“submit”class =“button large primary one-click-submit”name =“save”value =“save”onclick =“sanitizeManifestURL()”>

  5. 第4步是麻烦。这是代码:

        function(apptitle,category){
                page.evaluate(function(apptitle,category){
                        document.getElementById('title').value=apptitle;
                        var sel = document.querySelector('select');
                        sel.selectedIndex = 16;
                        sanitizeManifestURL();
                },apptitle,category);
                page.render('step4.png');
                console.log(page.content);
        },
    

    我使用console.log()转储生成的HTML并且它很长,所以我创建了这个pastebin:http://pastebin.com/kjg6XqSW

    这是我生成的屏幕截图。

    enter image description here

    我应该注意的另一件事是我可以通过Chrome浏览器的开发者控制台使用该按钮。

    更新1:

    谢谢Igor,但我仍然无法点击按钮。这是整个剧本:

    //
    //  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 https://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:
             * https://stackoverflow.com/questions/32771609/how-to-click-on-selectbox-options-using-phantomjs
             *
             */
    
            function(apptitle,category,click){
                    console.log('Step 4 - save app ' + apptitle);
                    page.evaluate(function(apptitle,category,click){
                            document.getElementById('title').value=apptitle;
                            var sel = document.querySelector('select');
                            sel.selectedIndex = 16;
                            // this works
                            var evt = document.createEvent("HTMLEvents");
                            evt.initEvent("change", false, true);
                            sel.dispatchEvent(evt);
    
                            //The form will be submitted, by click on the button:
                            click('#submit_button');
                    },apptitle,category,click);
    
    //              setTimeout(function(){
                            page.render('step4.png');
    //                      console.log(page.content);
    //              },200);
            }
    ];
    
    /**********END STEPS THAT FANTOM SHOULD DO***********************/
    
    //Execute steps one by one
    interval = setInterval(executeRequestsStepByStep,50);
    function click(sel){
            var event=document.createEvent('MouseEvents');
            event.initMouseEvent('click',1,1,window,1,0,0,0,0,0,0,0,0,0,null);
            document.querySelector(sel).dispatchEvent(event);
    }
    
    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, click);
            } else {
                steps[testindex]();
            }
            testindex++;
        }
        if (typeof steps[testindex] != "function") {
            console.log("test complete!");
            phantom.exit();
        }
    }
    
    /**
     * 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);
    };
    

1 个答案:

答案 0 :(得分:1)

PhantomJS在工作完成前退出 完成这些步骤后,我们需要等待。

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