PhantomJs – 从页面中获取价值。评估+ ajax(同步版)
问题:从page.evaluate
ajax
请求中提取数据
描述:我通常通过简单地返回它们来获取页面外的变量。 但是,我需要在页面的上下文中创建一个ajax
请求,然后我需要从页面的上下文中处理它的结果。
我试图解决的代码是:
var theOutput = page.evaluate(function () { return $.ajax({ async: false, url: 'http://localhost:8080/captcha.php', data: { filename: 'C:\\wamp\\www\\images\\0.png' }, type: 'post', success: function (output) { parsed_output = $.parseHTML(output); return parsed_output[4].data.trim(); }, }); }); console.log(theOutput);
变量parsed_output[4].data.trim()
是一个字符串。 但是当我记录output
我得到一个[object Object]
,其属性为abort, always, complete, done, error, fail, getAllResponseHeaders, getResponseHeader, overrideMimeType, pipe null, progress, promise, readyState, setRequestHeader, state, statusCode, success,then
。
问题:如何从page.evaluate
提取page.evaluate
?
由于这是一个阻塞的AJAX请求,您可以创建一个临时变量:
var theOutput = page.evaluate(function () { var result; $.ajax({ async: false, ... success: function (output) { parsed_output = $.parseHTML(output); result = parsed_output[4].data.trim(); }, }); return result; }); console.log(theOutput);
您还可以直接从jqXHR对象访问responseText
:
var theOutput = page.evaluate(function () { var jqXHR = $.ajax({ async: false, url: 'http://localhost:8080/captcha.php', data: { filename: 'C:\\wamp\\www\\images\\0.png' }, type: 'post' }); parsed_output = $.parseHTML(jqXHR.responseText); return parsed_output[4].data.trim(); }); console.log(theOutput);
如果您担心不推荐使用async: false
,则只需使用基础XMLHttpRequest即可使用阻塞执行:
var theOutput = page.evaluate(function () { var request = new XMLHttpRequest(); request.open('POST', 'http://localhost:8080/captcha.php', false); request.send($.param({ filename: 'C:\\wamp\\www\\images\\0.png' })); var parsed_output = $.parseHTML(request.responseText); return parsed_output[4].data.trim(); }); console.log(theOutput);