2014年9月8日 星期一

使用phantomjs+casperjs遇到的坑

这两周帮同学搞一个网站上的在线书籍接触到了phantomjscasperjscasperjs大法确实不错啊,可以编排模拟网页访问操作步骤,并截取页面中的指定区域或元素的内容。不过这东西坑和bug也不少,现在把一些还有印象的东西记录一下。

1.循环
Casperjs的执行方式类似于感觉就像在写汇报,而且不支持向后跳转到之前的step,不过也不是完全没有办法循环了,网上的办法是通过递归调用来实现的,就像这样(别忘了在外面初始化一下i):

casper.someloop = function() {
    this.then(function () {
        if(this.i == 10){
this.echo(loop end);
this.exit();
        }
this.i++
});
this.run(this.someloop);
}

同时如果处理的是一个数组内的所有元素的话,还可以用each或者eachThen,官网的例子如下:
var links = [
    'http://google.com/',
    'http://yahoo.com/',
    'http://bing.com/'
];

casper.start().each(links, function(self, link) {
    self.thenOpen(link, function() {
        this.echo(this.getTitle());
    });
});

casper.run();

不过这个函数有个限制,第一个参数传入的数组不可以是在之前某个step中动态获取到的数组,它是不会理会动态获取到的结果的。

2.等待
首先,所有等待函数放在各类then中执行会出问题,根本就不等直接就过去了,也不知道这算不算是casperjsbug。然后是waitFor系列函数,waitFor系列函数是自带超时的,并不是你不传入超时时间它就一直等下去了。还有startopen系列函数打开网页好像没法在网页所有资源加载完毕之前就走到后面的等待判断中。

3.Selector
并不是使用document.querySelector能对象就可以使用casperjs的带selector系列函数,具体什么样的元素可以什么样的元素不可以我还么有找到规律,好像是动态创建的元素会有这个问题。

4.PDF
使用casperjscapture函数截取pdf的时候会出很多问题,同样的问题在截取图片或者使用phantomjs原生的capture函数时并不会发生,同时会引发下面一个问题

5.casper.options.page
想要解决上面的那个问题又不想截取成图片,翻翻文档貌似就这个东西可用了,不过这应该是一个未完成的功能,设置了这个page对象之后,我的then就没触发过,一直在等待。

6.页面大小
打开一个网页,然后使用evaluate函数执行js修改网页大小,这是再使用capture函数截取网页内容会发现之前调整大小一点效果都没有,后来俺从github上搞了份没有tag的最新版问题才得以改善。

7.evaluate
这其实也不算是坑,也就算是个注意事项吧,使用evaluate执行脚本的时候如果想要引用function外面的变量需要传参进去,否则是不能用的。

8.其他
其实casperjs这东西坑肯定不止这点,有些我忘记了有些我还没遇到,被恶心的时候可以尝试从github上搞个新版本下来。

沒有留言:

張貼留言