1

PhantomJS を使用してフォームに入力して送信し、結果のページを出力しています。問題は、これが提出されているかどうかはまったくわかりません。

結果のページを印刷しますが、元のページと同じです。これがリダイレクトされたのか、送信しなかったのか、それとももっと待つ必要があるのか​​ 、それとも. 実際のブラウザでは、GET を送信して Cookie を受信します。これを使用して、さらに GETS を送信してから、最終結果であるフライト データを受け取ります。

この例How to submit a form using PhantomJSを、異なる url と page.evaluate 関数を使用してコピーしました。

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("http://www.klm.com/travel/dk_da/index.htm");
  },
  function() {
    //Enter Credentials
    page.evaluate(function() {

                     $("#ebt-origin-place").val("CPH");
                    $("#ebt-destination-place").val("CDG");
                    $("#ebt-departure-date").val("1/5/2013");
                    $("#ebt-return-date").val("10/5/2013");

    });
  }, 
  function() {
    //Login
    page.evaluate(function() {

    $('#ebt-flightsearch-submit').click() ; 

     # also tried:
     # $('#ebt-flight-searchform').submit();   

    });
  }, 
  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);
4

1 に答える 1

0

関心のあるサイトをこするのはかなり複雑です。US KLM サイトからの HTTP トラフィックをログに記録したところ、次のようになりました。

GET /travel/us_en/apps/ebt/ebt_home.htm?name=on&ebt-origin-place=New+York+-+John+F.+Kennedy+International+%28JFK%29%2CNew+York&ebt-destination-place=パリ+- +シャルル+ド+ゴール+空港+%28CDG%29%2C+フランス&c%5B0%5D.os=JFK&c%5B0%5D.ost=空港&c%5B0%5D.ds=CDG&c%5B0%5D.dst=空港&c%5B1 %5D.os=CDG&c%5B1%5D.ost=airport&c%5B1%5D.ds=JFK&inboundDestinationLocationType=airport&redirect=no&chdQty=0&infQty=0&c%5B0%5D.dd=2013-07-31&c%5B1%5D.dd=2013 -08-14&c%5B1%5D.format=dd%2Fmm%2Fyyyy&flex=true&ebt-cabin-class=ECONOMY&adtQty=1&goToPage=&cffcc=ECONOMY&sc=false HTTP/1.1

フォーム要素に挿入された値は、サーバーが探しているものではありません。

page.evaluate() 内ではサンドボックス化されていますが、サンプル コードには、サンドボックス化されたコンソール アクティビティを外部コンソールに取得するためのフックが含まれています。他のデバッグでは、オブジェクト インスペクターなどを含めることもできますが、これらはページまたは evaluate() に渡されるコードの一部に挿入する必要があります。

于 2013-07-24T23:51:08.513 に答える