为什么我没有收到phantomjs页面响应?[英] Why am I not receiving phantomjs page response?

问题描述

我正在尝试使用 phantomjs(版本 1.9.1,在 Windows 上)访问一些 QUnit 测试 URL.我在公司站点的代理后面,但我试图访问的 URL 是从我的本地开发工作站提供的,而且我什至尝试使用其他两个浏览器(Hv3 和 Dooble)访问相同的 URL,而无需代理设置,它们会得到 HTML 响应,即使它们无法执行 QUnit javascript.

所以我什至尝试将 javascriptEnabled 设置(加上另外几个设置,请参见下面的代码)调整为 false 以尝试仅获取原始 HTML,但无济于事.我已经将对 page.open 的调用包含在 try/catch 中,但显然这不是因为异常;而是在执行最后一个 phantom.exit() 语句之前的 console.log 语句.

此外,我已遵循 https://github.com/ariya/phantomjs 的建议/wiki/Network-Monitoring 包括来自 page.onResourceRequested、page.onError 和 page.onResourceReceived 的日志记录,并且仅执行 onResourceReceived 的回调.而且我指定了 --proxy-type=none 命令行参数,一切都无济于事.

下面的代码和输出,在此先感谢.我不知所措;也许这是一个phantomjs问题?只是想在报告之前排除一切.

代码:

var page = require('webpage').create();

page.onResourceRequested = function (request) {
    console.log('Request ' + JSON.stringify(request, undefined, 4));
};

page.onResourceReceived = function (response) {
    console.log('Receive ' + JSON.stringify(response, undefined, 4));
};

page.onError = function (msg, trace) {
    console.log(msg);
    trace.forEach(function(item) {
        console.log('  ', item.file, ':', item.line);
    })
}

page.settings.webSecurityEnabled = false;
page.settings.localToRemoteUrlAccessEnabled = true;
//page.settings.javascriptEnabled = false;

for (var setting in page.settings) {
    console.log(setting + ": " + page.settings[setting]);
}

try {
    page.open('http://local.example.com:9001/test/workflow', function() {
        console.log('page opened');
    });
}
catch(xcep) {
    console.log(xcep);
}

console.log('before exit');
phantom.exit();

输出:

XSSAuditingEnabled: false
javascriptCanCloseWindows: true
javascriptCanOpenWindows: true
javascriptEnabled: true
loadImages: true
localToRemoteUrlAccessEnabled: true
userAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34
webSecurityEnabled: false
Request {
    "headers": [
        {
            "name": "User-Agent",
            "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"
        },
        {
            "name": "Accept",
            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        }
    ],
    "id": 1,
    "method": "GET",
    "time": "2013-07-12T09:49:58.262Z",
    "url": "http://local.example.com:9001/test/workflow"
}
before exit

推荐答案

page.open() 是异步的.因此,带有 phantom.exit() 的行将在页面加载之前执行,这会停止 PhantomJS 进程.将 phantom.exit() 移动到 page.open() 的回调中并将其放在回调的末尾(即,在您的处理代码之后).所以基本上你会得到这个:

page.open('http://local.example.com:9001/test/workflow', function() {
      console.log('page opened');

      phantom.exit();
});

本文地址:https://www.itbaoku.cn/post/1740191.html