我正在使用PhantomJS填写并提交表单,然后输出结果页面。问题是,我根本不知道是否提交了这件事。
我打印生成的页面,但它与原始页面相同。我不知道这是因为它重定向还是我没有提交它,或者我需要等待更长时间或者或者或者。在真实的浏览器中,它发送一个GET并接收一个cookie,用于在最终收到最终结果 - 飞行数据之前发送更多GETS。
我使用不同的url和page.evaluate函数复制了此示例How to submit a form using PhantomJS。
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);
答案 0 :(得分:0)
感兴趣的网站相当复杂。我记录了来自美国荷兰皇家航空公司网站的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就地=巴黎+ - +查尔斯+德+戴高乐+机场+%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 =机场和C%5B1%5D.ds = JFK&安培; inboundDestinationLocationType =机场&安培;重定向=否安培; chdQty = 0&安培; infQty = 0和C%5B0%5D.dd = 2013年7月31日和C%5B1%5D.dd = 2013年8月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()的页面或部分代码中。