当从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作为消息总线,但我正在寻找更好的解决方案。
由于
答案 0 :(得分:3)
在PhantomJS(以及CasperJS)中,evaluate
在被监禁的环境中运行。只接受原始对象,即可以通过JSON.stringify
和JSON.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()