我正在计划内部使用的webservice,它接受一个参数,一个URL,并返回表示该URL中已解析 DOM的html .通过解决,我的意思是webservice将首先获取该URL的页面,然后使用PhantomJS"渲染"页面,然后在执行所有DHTML,AJAX调用等之后返回结果源.但是发动对每个请求的基础(这是我现在做)幽灵的方式过于缓慢.我宁愿拥有一个PhantomJS实例池,其中一个实例可用于为我的webservice提供最新的调用.
以前有没有做过这方面的工作?我宁愿将这个web服务基于其他人的工作,而不是从头开始为我自己编写一个池管理器/ http代理服务器.
更多上下文:我列出了迄今为止我见过的两个类似的项目,以及为什么我避免了每个项目,这导致了关于管理PhantomJS实例池的问题.
jsdom - 从我所看到它在页面上执行脚本具有很强的功能,但它不会尝试复制浏览器行为,因此如果我将它用作通用的"DOM解析器",那么它最终会成为很多额外的编码来处理各种边缘情况,事件调用等.我看到的第一个例子是必须为我使用node设置的测试应用程序手动调用body标签的onload()函数.这似乎是一个深深的兔子洞的开始.
Selenium - 它只有很多移动部件,因此设置一个池来管理长期存在的浏览器实例将比使用PhantomJS更复杂.我不需要它的任何宏录制/脚本功能.我只想要一个能够获得网页并解析它的DOM的web服务,就好像我用浏览器浏览到那个URL一样(如果我可以让它忽略图像等,甚至更快)
我正在寻找一个请求网页,等待JavaScript呈现(JavaScript修改DOM),然后抓取页面的HTML的示例.
这应该是一个简单的例子,有一个明显的PhantomJS用例.我找不到一个体面的例子,文档似乎都是关于命令行使用的.
我有几个节点包可以在node.js环境中运行,也可以在浏览器中运行.现在我有两个单独的测试(针对每个环境).使用npm test命令运行这些测试的最佳方法是什么?另外我想将这些包添加到travis.
我正在使用mocha和mocha-phantomjs.
节点测试命令
node ./node_modules/mocha/bin/mocha ./test/node/index.js --reporter spec
Run Code Online (Sandbox Code Playgroud)
浏览器测试命令
node ./node_modules/mocha-phantomjs/bin/mocha-phantomjs ./test/browser/index.html
Run Code Online (Sandbox Code Playgroud)
我尝试了什么:
npm test以分号分隔的脚本中
npm test脚本中测试并为浏览器测试创建自定义脚本.然后将这两个命令(npm test和npm run-script test-browser)添加到travis.yml作为数组.
npm test脚本中测试并将浏览器测试添加到npm posttest命令.Travis.yml将只有一个脚本,用户也必须运行一个脚本(每个人都很高兴).
我正在使用PhantomJS page.evaluate()进行一些抓取.我的问题是我传递给webkit页面的代码是沙箱,因此无法访问我的主幻像脚本的变量.这使得抓取代码难以通用.
page.open(url, function() {
var foo = 42;
page.evaluate(function() {
// this code has no access to foo
console.log(foo);
});
}
Run Code Online (Sandbox Code Playgroud)
我如何将参数推入页面?
我有一个很长的脚本,不是我写的.当我运行它时,我得到:
phantomjs file.js
SyntaxError: Parse error
Run Code Online (Sandbox Code Playgroud)
我检查了手册和--help,我能想到的最好的是:
phantomjs --debug=yes file.js
(irrelevant debug statement from CookieJar)
SyntaxError: Parse error
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来获得至少一个行号?或任何暗示?
phantomjs有配置loadImage,
但我想要更多,
如何控制phantomjs跳过下载某种资源,
比如css等......
=====
好消息:此功能已添加.
https://code.google.com/p/phantomjs/issues/detail?id=230
要旨:
page.onResourceRequested = function(requestData, request) {
if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || requestData['Content-Type'] == 'text/css') {
console.log('The url of the request is matching. Aborting: ' + requestData['url']);
request.abort();
}
};
Run Code Online (Sandbox Code Playgroud) 我不确定为什么PhantomJS是必要的,我希望有人可以提供帮助.
有一个我试图抓取的网站,首先加载一个html/js使用js然后POST修改表单输入字段.如何获取POSTed页面的最终html输出?
我尝试用phantomjs做这个,但它似乎只有渲染图像文件的选项.谷歌搜索表明它应该是可能的,但我无法弄清楚如何.我的尝试:
var page = require('webpage').create();
var fs = require('fs');
page.open('https://www.somesite.com/page.aspx', function () {
page.evaluate(function(){
});
page.render('export.png');
fs.write('1.html', page.content, 'w');
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
这段代码将用于客户端,我不能指望他安装太多的包(nodejs,casperjs等)
谢谢
我已经尝试按照ng-directive-testing repo 的格式来编写我编写的指令.当用户点击元素时,该指令基本上呈现叠加.这是指令(简化):
mod.directive('uiCopyLinkDialog', function(){
return {
restrict: 'A',
link: function(scope, element, attrs) {
var $elm = angular.element(element);
element.bind('click', function(event) {
$elm.addClass('test');
});
}
};
});
Run Code Online (Sandbox Code Playgroud)
我写的测试看起来像这样:
describe('pre-compiled link', function () {
beforeEach(mocks.inject(function($compile, $rootScope) {
scope = $rootScope;
element = angular.element('<span class="foo" ui-copy-link-dialog="url"></span>');
$compile(element)(scope);
scope.$digest();
}));
it("should change the class when clicked", function () {
element.click(); // this returns "'undefined' is not a function"
element[0].click(); // so does this
$(elm).click(); // this uses jquery and doesn't *seem* to fail …Run Code Online (Sandbox Code Playgroud) phantomjs ×10
javascript ×4
node.js ×3
testing ×2
web-scraping ×2
angularjs ×1
browser ×1
capybara ×1
coffeescript ×1
html ×1
jsdom ×1
mocha.js ×1
poltergeist ×1