PhantomJs - 从 page.evaluate + ajax 中获取价值(同步版本)
PhantomJs - Getting value out of page.evaluate + ajax (Synchronous Version)
问题: 从 ajax
请求中提取数据 page.evaluate
描述: 我通常通过简单地返回变量来从 page.evaluate
中获取变量。但是,我需要在页面上下文中发出 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
中提取theOutput
?
由于这是一个阻塞 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);
问题: 从 ajax
请求中提取数据 page.evaluate
描述: 我通常通过简单地返回变量来从 page.evaluate
中获取变量。但是,我需要在页面上下文中发出 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
中提取theOutput
?
由于这是一个阻塞 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);