为什么我没有收到phantomjs页面响应
Why am I not receiving phantomjs page response?
我正在尝试使用phatomjs(Windows上的1.9.1版本)访问一些QUnit测试URL。我在一个公司网站上使用代理,但我试图访问的URL是从我的本地开发工作站提供的,此外,我甚至尝试过在没有必要代理设置的情况下使用其他两个浏览器(Hv3和Dooble)访问相同的URL,即使它们不能执行QUnit javascript,它们也会得到HTML响应。
因此,我甚至尝试将javascriptEnabled设置(加上另外两个设置,请参阅下面的代码)调整为false,试图只获取原始HTML,但没有成功。我已经尝试/捕获了对page.open的调用,但显然这不是因为异常;而是紧接在执行最后一个phantom.exit()语句之前的console.log语句。
此外,我还遵循了https://github.com/ariya/phantomjs/wiki/Network-Monitoring包括从page.onResourceRequested、page.oError和page.onSourceReceived进行日志记录,并且只执行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();
});
我只是想在这里弥补自己的愚蠢,忘记了对page.open的回调。正如在对我接受的答案的评论中所提到的,我不喜欢在回调中调用phantom.exit(),因为我实际上需要在循环中执行它。
下面是使用闭包实现这一点的方法,包括使用try/catch来确保phantom.exit()始终被调用。
注意:而不是声明
page = require('webpage').create()
在顶部,我们只是创建一个对网页模块的引用,然后在每次循环迭代时将webpage.create()传递到闭包中。
代码:
var fs = require('fs'),
webpage = require('webpage');
var publicJsDir = [fs.workingDirectory, '..', 'public', 'js'].join(fs.separator),
testNames = fs.list(publicJsDir).map(function(file){
return (file.match(/^(.*)'.test'.js$/) || [])[1];
}).filter(function(val) {return val});
for (var i=testNames.length; i--; ) {
(function(i, testName, page){
try {
console.log(testName); //page.open(...
if (!i) phantom.exit();
}
catch(xcep) {
console.log(xcep);
phantom.exit();
}
})(i, testNames[i], webpage.create());
}
输出:
workflow
workflow.cloning
utils.trains
utils.stations
models.trains.processors
models.stations
gis
fp
flow
ds
- 如何将getJson的响应保存在全局变量中
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 使用angularjs向浏览器发送servlet响应(下载功能)
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 不再使用innerHTML进行AJAX响应.(代码未得到响应)
- 为什么可以't我使用了AJAX响应的一部分
- 响应动画手风琴不工作
- 我如何才能让CasperJS和PhantomJS在约塞米蒂玩得很好
- 如何从SeleniumWebdriver获取异步Javascript响应
- Ajax调用在Firefox中不会自动响应
- 可以在响应时隐藏iphone上的“播放”按钮以进行视频播放
- PhantomJS - 检查javascript函数是否正在运行的任何方法
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- Phantomjs 检查响应标头,然后执行某些操作
- 从php启动phantomjs服务器并等待它的响应
- 使用nodeJS和phantomJS返回网络请求和响应,仅在控制台中工作
- 为什么我没有收到phantomjs页面响应
- 如何在PhantomJS中保存XML GET响应到文件
- 从phantomjs子进程在节点中发送二进制响应
- PhantomJS.Org 需要很长时间才能响应我的幻影 js 脚本