PhantomJS का उपयोग करके फॉर्म कैसे जमा करें


161

मैं उस पृष्ठ के लिए एक फ़ॉर्म सबमिट करने के लिए 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();
}

जवाबों:


227

मैं यह समझ गया। मूल रूप से यह एक async समस्या है। आप बस सबमिट नहीं कर सकते हैं और बाद के पेज को तुरंत रेंडर करने की उम्मीद कर सकते हैं। अगले पेज के चालू होने तक आपको इंतजार करना होगा। मेरा कोड नीचे है:

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

3
यह एक महान टेम्पलेट है। यहाँ कुछ चीजें मैंने जोड़ी हैं: अंदर का setIntervalउपयोग var func = steps[testindex], फिर console.log("step " + (testindex + 1) + ": " + funcName(func))। यह आपको किए जा रहे चरणों के विवरण को जोड़ने की अनुमति देता है।
जोनो

देखने के लिए यहाँ के लिए funcName। वेब पेजों की एक श्रृंखला से गुजरते हुए, और विभिन्न तकनीकों को आजमाते हुए, अंतिम पृष्ठ का उपयोग करके रेंडर करना आसान हुआ page.render("output.png");
जोनो

2
यह वाकई मददगार पोस्ट है। हालांकि एक सवाल। जब आप POST का उपयोग करके फ़ॉर्म सबमिट करते हैं, तो डेटा सर्वर को भेजा जाता है, और सर्वर प्रतिक्रिया देता है। वह कोड कहां है जहां आप इस प्रतिक्रिया को संभालते हैं या यह स्वचालित रूप से प्रेत द्वारा किया जाता है? फॉर्म सबमिशन के बाद, एक सर्वर वापस आ सकता है COOKIE, और मेरा सवाल यह है: * क्या यह कुकी phantom.cookiesऑब्जेक्ट में उपलब्ध है जब सर्वर प्रतिक्रिया देता है * ?
मि। जूल

CasperJS को PhantomJS से बेहतर बनाता है, इसकी जटिल कोडिंग के बिना फॉर्म में पोस्ट करने की क्षमता है
waza123

क्या आप कृपया इसे भी देख सकते हैं stackoverflow.com/questions/44624964/phantom-js-on-web-project
मानिक

62

इसके अलावा, CasperJS, PhantomJS में नेविगेशन के लिए एक अच्छा उच्च-स्तरीय इंटरफ़ेस प्रदान करता है, जिसमें लिंक पर क्लिक करना और फ़ॉर्म भरना शामिल है।

CasperJS

PhantomJS और CasperJS की तुलना करते हुए 28 जुलाई, 2015 के लेख को जोड़ने के लिए अपडेट किया गया ।

(टिप्पणी करने के लिए धन्यवाद मिस्टर एम!)


1
कैस्पर ने मेरे लिए काम नहीं किया क्योंकि आप केवल नाम का उपयोग करके एक फॉर्म इनपुट भर सकते थे। मुझे आईडी का उपयोग करने की आवश्यकता थी।
user984003

4
@ user984003 आपको #someidएक आईडी के आधार पर भरने के लिए अपने चयनकर्ता को सेट करने में सक्षम होना चाहिए ।
arboc7

2
कैस्परज एक देवता है! यह ASPX पृष्ठों को एक हवा में स्क्रैप करता है। धन्यवाद!
टोबिया

@ user984003 मुझे नहीं पता कि क्या आप पुराने संस्करण का उपयोग कर रहे हैं, लेकिन किसी भी चयनकर्ता का उपयोग करके फॉर्म फ़ील्ड भरने के लिए वर्तमान में एक fillSelectors () है।
टोबिया

3
जो कोई भी PhantomJS का उपयोग कर रहा है, उसे CasperJS का उपयोग शुरू करना चाहिए। यहाँ पोस्ट का वर्णन क्यों किया गया है: code-epicenter.com/why-is-casperjs-better-than-phantomjs
MrD

19

कच्चे POST अनुरोध भेजना कभी-कभी अधिक सुविधाजनक हो सकता है। नीचे आप PhantomJS से पोस्ट के मूल उदाहरण देख सकते हैं

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

6
जागरूक रहें, पाठकों, कि GETइसी तरह अनुरोध करने (कुछ ऐसा करके page.open(server, 'get', data, ...) काम नहीं करेगा।
zbr

7

जैसा कि ऊपर उल्लेख किया गया था कि कैस्परजेएस फॉर्म भरने और भेजने के लिए सबसे अच्छा उपकरण है। भरण () फ़ंक्शन का उपयोग करके फ़ॉर्म कैसे भरें और सबमिट करें इसका सरल संभव उदाहरण :

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();
  });
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.