为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用PhantomJS提交表单

/ 猿问

如何使用PhantomJS提交表单

12345678_0001 2019-10-23 14:33:24

我正在尝试使用phantomJS(真棒的工具btw!)为具有登录凭据的页面提交表单,然后将目标页面的内容输出到stdout。我可以使用幻像访问该表单并成功设置其值,但是我不太确定提交表单并输出后续页面内容的正确语法。到目前为止,我有:


var page = new WebPage();

var url = phantom.args[0];


page.open(url, function (status) {


  if (status !== 'success') {

      console.log('Unable to access network');

  } else {


    console.log(page.evaluate(function () {


      var arr = document.getElementsByClassName("login-form");

      var i;


      for (i=0; i < arr.length; i++) {


        if (arr[i].getAttribute('method') == "POST") {

          arr[i].elements["email"].value="mylogin@somedomain.com";

          arr[i].elements["password"].value="mypassword";


          // This part doesn't seem to work. It returns the content

          // of the current page, not the content of the page after 

          // the submit has been executed. Am I correctly instrumenting

          // the submit in Phantom?

          arr[i].submit();

          return document.querySelectorAll('html')[0].outerHTML;

        }


      }


      return "failed :-(";


    }));

  }


  phantom.exit();

}


查看完整描述

3 回答

?
慕标5265247

我想到了。基本上,这是一个异步问题。您不能只是提交并期望立即呈现下一页。您必须等到触发下一页的onLoad事件。我的代码如下:


var page = new WebPage(), testindex = 0, loadInProgress = false;


page.onConsoleMessage = function(msg) {

  console.log(msg);

};


page.onLoadStarted = function() {

  loadInProgress = true;

  console.log("load started");

};


page.onLoadFinished = function() {

  loadInProgress = false;

  console.log("load finished");

};


var steps = [

  function() {

    //Load Login Page

    page.open("https://website.com/theformpage/");

  },

  function() {

    //Enter Credentials

    page.evaluate(function() {


      var arr = document.getElementsByClassName("login-form");

      var i;


      for (i=0; i < arr.length; i++) { 

        if (arr[i].getAttribute('method') == "POST") {


          arr[i].elements["email"].value="mylogin";

          arr[i].elements["password"].value="mypassword";

          return;

        }

      }

    });

  }, 

  function() {

    //Login

    page.evaluate(function() {

      var arr = document.getElementsByClassName("login-form");

      var i;


      for (i=0; i < arr.length; i++) {

        if (arr[i].getAttribute('method') == "POST") {

          arr[i].submit();

          return;

        }

      }


    });

  }, 

  function() {

    // Output content of page to stdout after form has been submitted

    page.evaluate(function() {

      console.log(document.querySelectorAll('html')[0].outerHTML);

    });

  }

];



interval = setInterval(function() {

  if (!loadInProgress && typeof steps[testindex] == "function") {

    console.log("step " + (testindex + 1));

    steps[testindex]();

    testindex++;

  }

  if (typeof steps[testindex] != "function") {

    console.log("test complete!");

    phantom.exit();

  }

}, 50);


查看完整回答
反对 回复 2019-10-23
?
繁星点点滴滴

发送原始POST请求有时会更方便。在下面您可以看到PhantomJS的post.js原始示例


// Example using HTTP POST operation


var page = require('webpage').create(),

    server = 'http://posttestserver.com/post.php?dump',

    data = 'universe=expanding&answer=42';


page.open(server, 'post', data, function (status) {

    if (status !== 'success') {

        console.log('Unable to post!');

    } else {

        console.log(page.content);

    }

    phantom.exit();

});


查看完整回答
反对 回复 2019-10-23
?
三国纷争

如前所述,CasperJS是填写和发送表格的最佳工具。如何使用fill()函数填写和提交表单的最简单示例:


casper.start("http://example.com/login", function() {

//searches and fills the form with id="loginForm"

  this.fill('form#loginForm', {

    'login':    'admin',

    'password':    '12345678'

   }, true);

  this.evaluate(function(){

    //trigger click event on submit button

    document.querySelector('input[type="submit"]').click();

  });

});


查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信