PhantomJs-从页面中获取值.evaluate+ajax(同步版本)



问题:page.evaluate 内的ajax请求中提取数据

描述:我通常通过简单地返回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);

相关内容

  • 没有找到相关文章

最新更新