从DOM上下文中调用casperjs捕获(评估)

时间:2012-12-30 15:29:54

标签: javascript unit-testing dom phantomjs casperjs

当从evaluate上下文调用函数时,有没有办法调用casperjs方法,比如capture?

说明:我希望能够编写可以在“真实”浏览器或casper中运行的js脚本(qunit)。

示例:

function screenshot()(
//i'm runing in a "real" browser ? Then only console.log 
//i'm running in casper ? Then call capser.capture()

我试着用封闭但是失败了:

var casper = require('casper').create();
casper.start('http://google.fr/');

casper.evaluate(function(o) {
o.capture('/tmp/google.png', {
    top: 100,
    left: 100,
    width: 500,
    height: 400
});
}, {o: this});

casper.run()


TypeError: JSON.stringify cannot serialize cyclic structures.                   
  :/modules/webpage.js:249
  /Users/macbookpro/js:576 in evaluate
  /Users/macbookpro/js/testClosure.js:11

我知道有一种方法可以使用console.log作为消息总线,但我正在寻找更好的解决方案。

由于

2 个答案:

答案 0 :(得分:3)

在PhantomJS(以及CasperJS)中,evaluate在被监禁的环境中运行。只接受原始对象,即可以通过JSON.stringifyJSON.parse序列化的对象。

通常的做法是从主脚本运行屏幕截图。您仍然可以触发来自其他地方的捕获,包括evaluate内的捕获,您只需将其传回主脚本即可。查看包含run-qunit.js示例的PhantomJS示例,该示例通过监视特定DOM元素的存在来检测测试的完成。

答案 1 :(得分:2)

无法在evaluate()内运行casper方法。这是你的代码,修复:

var casper = require('casper').create();

casper.start('http://google.fr/', function() {
    this.capture('google.png', {
        top: 100,
        left: 100,
        width: 500,
        height: 400
    });
});

casper.run()