2013-07-12 35 views
0

我想使用phantomjs(版本1.9.1,在Windows上)访问一些QUnit测试网址。我在公司网站的代理背后,但我试图访问的URL是从我的本地开发工作站提供的,另外我甚至尝试在没有必要的情况下使用其他两个浏览器(Hv3和Dooble)访问相同的URL代理设置,即使他们无法执行QUnit JavaScript,他们也会获得HTML响应。为什么我没有收到phantomjs页面响应?

所以我甚至试着调整javascriptEnabled设置(加上另外几个设置,请参阅下面的代码)为false,试图获取原始HTML,但无济于事。我在try/catch中将我的调用封装到了page.open中,但显然这不是因为异常;而是在最终的phantom.exit()语句执行之前立即使用console.log语句。

此外,我遵循https://github.com/ariya/phantomjs/wiki/Network-Monitoring的建议,包括从page.onResourceRequested,page.onError和page.onResourceReceived进行日志记录,并且只有onResourceReceived的回调被执行。而我指定--proxy-type = none命令行参数,都无济于事。

代码和输出如下,在此先感谢。我无所适从;也许这是一个幻影问题?只是想在报告之前排除所有事情。

CODE:

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(); 

OUTPUT:

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 

回答

4

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(); 
}); 
+0

感谢,做课程的伎俩。我的想法是我不想在与page.open回调相同的块内使用phantom.exit(),因为我实际上想要连续打开几个页面。我想我可以想办法做到这一点,使用关闭和减少柜台。 –

+1

@GeorgeJempty它对异步操作有点棘手,但是,是的,你可以做到这一点。即使有多个异步操作,您只需要知道何时达到了停止条件。正如你所建议的那样,你可以通过多种方式来应对。 –

1

只是想这里是这样一个笨蛋,忘记回调page.open挽救自己执行asyncrhonously。正如在我接受的答案的评论中提到的那样,我很讨厌从该回调中调用phantom.exit(),因为我实际上需要在循环中进行。

那么这里有一个关闭的方法,包括使用try/catch来确保phantom.exit()将始终被调用。

注:而不是在顶部宣布

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

,我们不是仅仅创造了网页模块的引用,然后通过webpage.create()为在每次循环的闭合。

CODE:

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()); 
} 

OUTPUT:

workflow 
workflow.cloning 
utils.trains 
utils.stations 
models.trains.processors 
models.stations 
gis 
fp 
flow 
ds 
相关问题