PhantomJS:提交表单

PhantomJS:提交表单,phantomjs,Phantomjs,我使用PhantomJS填写并提交表单,然后输出结果页面。问题是,我根本不知道这件事是否正在提交 我打印生成的页面,但它与原始页面相同。我不知道这是因为它重定向回来,还是我没有提交,或者我需要等待更长的时间。在真正的浏览器中,它发送一个GET并接收一个cookie,在最终接收最终结果——飞行数据之前,它使用cookie发送更多GET 我复制了这个示例,使用了不同的url和page.evaluate函数 var page = new WebPage(), testindex = 0, loadIn

我使用PhantomJS填写并提交表单,然后输出结果页面。问题是,我根本不知道这件事是否正在提交

我打印生成的页面,但它与原始页面相同。我不知道这是因为它重定向回来,还是我没有提交,或者我需要等待更长的时间。在真正的浏览器中,它发送一个GET并接收一个cookie,在最终接收最终结果——飞行数据之前,它使用cookie发送更多GET

我复制了这个示例,使用了不同的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);

这个有趣的地点很难清理。我记录了美国荷航网站的HTTP流量,得到了以下信息:

得到/travel/us_en/apps/ebt/ebt_home.htm?name=on&ebt出发地=纽约+York+-+John+F.+Kennedy+International+%28JFK%29%2C纽约+ebt目的地=巴黎+-+Charles+De+Gaulle+Airport+%28CDG%29%2C+法国&c%5B0%5D.os=JFK&c%5B0%5D.ost=Airport&c%5B0%5D.ds=CDG&c%5B0%5D.ds=CDG&c%5B0%5B0%5D.dst=机场&c%5B0%5D.dst=5D机场&c%5bj%5D=5bnd%5bjionType=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客舱等级=ECONOMY&adtQty=1&goToPage=&cffcc=ECONOMY&sc=false HTTP/1.1

表单元素的注入值不是它们的服务器所需要的


在page.evaluate内部,您是沙盒的,但是示例代码包含一个钩子,用于将沙盒控制台活动放到外部控制台上。对于其他调试,您也可以包括对象检查器等,但它们必须被注入到页面或传递到evaluate的部分代码中。

您可能希望尝试CasperJS–它与Phantom一起工作,以使其更加友好。我想问题是,我不确定此页面是否能工作。就好像他们在积极地阻止刮擦。PhantomJs是我正在尝试的第四件事。使用Casper,在操作之间暂停约400毫秒,将用户代理更改为匿名,例如“Mozilla/5.0 Macintosh;英特尔Mac OS X 10_8_3 AppleWebKit/536.28.10 KHTML,就像Gecko版本/6.0.3 Safari/536.28.10一样,它在网络工具包(如Phantom)上,但与OSX 10.8.3上的任何Safari用户一样,如果不起作用,都会感到惊讶。让我困惑或让我困惑的一件事是动作之间的等待。我是否需要为加载的每个页面/ajax调用执行一个操作,还是像一个真正的浏览器一样提交表单并执行其他所有操作?例如,该站点在显示实际数据之前会显示一个等待页面。我之所以等待,是因为我可以用它来检查它是否是机器人。不过,您所描述的是需要的——casper有一个很好的东西叫做waitForSelector:它只允许您在匹配选择器时继续,所以应该可以为您解决这个问题。