标签: phantomjs

如何管理PhantomJS实例的"池"

我正在计划内部使用的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一样(如果我可以让它忽略图像等,甚至更快)

node.js web-scraping jsdom phantomjs

66
推荐指数
4
解决办法
2万
查看次数

poltergeist/PhantomJS和capybara-webkit如何不同?

  1. PhantomJS和capybara-webkit有什么区别?
  2. 与PhantomJS相比,capybara-webkit有哪些优势?
  3. 哪两个是最有效的工具?
  4. 其他 ...

capybara phantomjs capybara-webkit poltergeist

60
推荐指数
3
解决办法
1万
查看次数

使用PhantomJS和node.js保存并呈现网页

我正在寻找一个请求网页,等待JavaScript呈现(JavaScript修改DOM),然后抓取页面的HTML的示例.

这应该是一个简单的例子,有一个明显的PhantomJS用例.我找不到一个体面的例子,文档似乎都是关于命令行使用的.

html javascript node.js web-scraping phantomjs

59
推荐指数
2
解决办法
6万
查看次数

如何从node.js中的一个"npm test"命令运行mocha和mocha-phantomjs测试?

我有几个节点包可以在node.js环境中运行,也可以在浏览器中运行.现在我有两个单独的测试(针对每个环境).使用npm test命令运行这些测试的最佳方法是什么?另外我想将这些包添加到travis.

我正在使用mochamocha-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)

我尝试了什么:

  1. 将这些命令添加到npm test以分号分隔的脚本中
    • 问题:当第一个脚本中出现错误但第二个脚本中没有错误时,命令退出0并传递travis构建.
  2. 让node命令在npm test脚本中测试并为浏览器测试创建自定义脚本.然后将这两个命令(npm testnpm run-script test-browser)添加到travis.yml作为数组.
    • 问题:用户必须手动运行两个独立的测试脚本.
  3. 让node命令在npm test脚本中测试并将浏览器测试添加到npm posttest命令.Travis.yml将只有一个脚本,用户也必须运行一个脚本(每个人都很高兴).
    • 问题:感觉不对,所以我想知道是否有更好的方法.

browser testing mocha.js node.js phantomjs

57
推荐指数
1
解决办法
3万
查看次数

使用page.evaluate传递参数

我正在使用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)

我如何将参数推入页面?

javascript phantomjs

53
推荐指数
3
解决办法
3万
查看次数

从phantomjs获取更多信息"SyntaxError:Parse error"消息

我有一个很长的脚本,不是我写的.当我运行它时,我得到:

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

53
推荐指数
3
解决办法
3万
查看次数

如何控制PhantomJS跳过下载某种资源?

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

52
推荐指数
3
解决办法
2万
查看次数

49
推荐指数
3
解决办法
1万
查看次数

执行页面的javascript后保存页面的html输出

有一个我试图抓取的网站,首先加载一个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等)

谢谢

javascript headless-browser phantomjs

49
推荐指数
2
解决办法
5万
查看次数

如何在AngularJS指令测试中模拟单击事件?

我已经尝试按照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 angularjs angularjs-directive

48
推荐指数
2
解决办法
5万
查看次数