ফ্যান্টমজেএস ব্যবহার করে কীভাবে একটি ফর্ম জমা দিন


161

আমি ফ্যান্টমজেএস ব্যবহার করার চেষ্টা করছি (কী বিস্ময়কর সরঞ্জাম বিটিডব্লু!) যে পৃষ্ঠার জন্য আমার লগইন শংসাপত্র রয়েছে তার জন্য একটি ফর্ম জমা দিতে এবং তারপরে গন্তব্য পৃষ্ঠার সামগ্রীটি স্টাডআউটে আউটপুট করে। আমি ফর্মটি অ্যাক্সেস করতে পেরেছি এবং ভ্যান্টম ব্যবহার করে এর মানগুলি সাফল্যের সাথে সেট করতে পেরেছি, তবে ফর্মটি জমা দেওয়ার জন্য সঠিক সিনট্যাক্সটি কী এবং পরবর্তী পৃষ্ঠার সামগ্রীর আউটপুট আউট করার বিষয়ে আমি নিশ্চিত নই। আমার এখন পর্যন্ত যা আছে তা হ'ল:

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

আমি এটি বের করেছিলাম। মূলত এটি একটি অ্যাসিঙ্ক সমস্যা। আপনি কেবল জমা দিতে এবং তত্ক্ষণাত্ পরবর্তী পৃষ্ঠাটি রেন্ডার করার আশা করতে পারবেন না। পরবর্তী পৃষ্ঠার জন্য অন -লোড ইভেন্টটি চালিত হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হবে। আমার কোডটি নীচে রয়েছে:

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সার্ভার প্রতিক্রিয়া ফেরত দেওয়ার সময় এই কুকিটি কি বস্তুতে পাওয়া যায় ?
মিঃডি

ফ্যান্টমজেএসের চেয়ে ক্যাস্পারজেএস এর আরও ভাল ব্যবহার করুন, জটিল কোডিং ছাড়াই ফর্মগুলিতে পোস্ট করার ক্ষমতা রয়েছে
waza123

আপনি কি দয়া করে এটি খুব স্ট্যাকওভারফ্লো.com
মানিক

62

এছাড়াও, ক্যাস্পারজেএস ফ্যান্টমজেজে নেভিগেশনের জন্য একটি দুর্দান্ত উচ্চ-স্তরের ইন্টারফেস সরবরাহ করে, লিঙ্কগুলিতে ক্লিক করা এবং ফর্মগুলি পূরণ সহ।

CasperJS

ফ্যান্টমজেএস এবং ক্যাস্পারজেএসের তুলনা করে জুলাই 28, 2015 নিবন্ধ যুক্ত করার জন্য আপডেট হয়েছে ।

(মন্তব্যকারী মিঃ এম কে ধন্যবাদ!)


1
ক্যাস্পার আমার পক্ষে কাজ করেনি কারণ আপনি কেবল নাম ব্যবহার করে একটি ফর্ম ইনপুট পূরণ করতে পারেন। আমার আইডি ব্যবহার করা দরকার।
ব্যবহারকারী984003

4
@ user984003 আপনার #someidআইডির ভিত্তিতে পূরণ করতে আপনার নির্বাচককে সেট করতে সক্ষম হওয়া উচিত ।
arboc7

2
ক্যাস্পারজেএস একটি গডসেন্ড! এটি এএসপিএক্স পৃষ্ঠাগুলিকে স্ক্র্যাপ করে বাতাসের মতো করে তোলে। ধন্যবাদ!
টোবিয়া

@ user984003 আপনি জানেন না যে আপনি কোনও পুরানো সংস্করণ ব্যবহার করছেন, তবে বর্তমানের একটিতে কোনও নির্বাচক ব্যবহার করে ফর্ম ক্ষেত্রগুলি পূরণ করতে একটি ফিলসিলেক্টর () রয়েছে।
টোবিয়া

3
যে কেউ ফ্যান্টমজেএস ব্যবহার করছেন তাদের ক্যাস্পারজেএস ব্যবহার শুরু করা উচিত। : এখানে পোস্ট কেন বর্ণনা করা হয়েছে code-epicenter.com/why-is-casperjs-better-than-phantomjs
MRD

19

কাঁচা পোষ্ট অনুরোধগুলি প্রেরণ কখনও কখনও আরও সুবিধাজনক হতে পারে। নীচে আপনি ফ্যান্টমজেএস থেকে পোস্ট.জেএস এর মূল উদাহরণ দেখতে পাবেন

// 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();
  });
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.