Javascript PhantomJs-从page.evaluate和#x2B;ajax(同步版本)

Javascript PhantomJs-从page.evaluate和#x2B;ajax(同步版本),javascript,jquery,ajax,phantomjs,Javascript,Jquery,Ajax,Phantomjs,问题:从ajax页面内的请求提取数据。评估 说明:我通常从页面获取变量。只需返回变量即可对其进行评估。但是,我需要在页面上下文中发出ajax请求,然后需要在页面上下文之外处理其结果 我试图修复的代码是: var theOutput = page.evaluate(function () { return $.ajax({ async: false, url: 'http://localhost:8080/captcha.php', data

问题:
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);
变量
已解析_输出[4]。data.trim()
是一个字符串。但是当我记录
output
时,我得到一个
[object object]
,属性为
abort、always、complete、done、error、fail、GetAllResponseHeader、getResponseHeader、OverrideMetype、pipe null、progress、promise、readyState、setRequestHeader、state、statusCode、success,然后是


问题:如何从
页面中提取
输出
。评估

由于这是一个阻止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);

两种解决方案的
null
。可能
async:false
不工作?(已弃用)
async
不能弃用,因为这是基础XMLHttpRequest对象的属性。注册到
onError
onsolemessage
事件,查看是否有错误。这应该行得通。可能是您的
parsed_输出[4]
选择了一些断开的元素,或者开始的元素少于5个。因此,
data
是未定义的。我找到了一种快速检查
输出
变量内容的方法。您可以在
页面外部添加
page.onConsoleMessage=function(msg){console.log(msg);}
打开
并在
页面内部使用
console.log
进行评估。使用它,我得到了
output
的内容,这是一堆html内容(正如预期的那样)。然而,在控制台中,我首先得到了
null
,然后是
输出中的html内容。这意味着,即使
async
设置为false,在执行
success
回调函数之前,
result
也会以某种方式被输出。我没有使用早期版本,因为我还需要函数
$.parseHTML
(在版本1.8.0中添加)。