如何使用casper.page.close()来避免多页打开时的内存泄漏

How to use casper.page.close() to avoid memory leak for multiple page open

本文关键字:泄漏 内存 page casper 何使用 close      更新时间:2023-09-26

当我打开一个数组中的许多页面(以千为单位)时,似乎存在内存泄漏,因为我在Windows中监视进程内存。

我读了这篇文章,决定使用http://phantomjs.org/api/webpage/method/close.html

以下是代码

var casper = require("casper").create({
      verbose: true,
      logLevel: 'debug',
      pageSettings: {
        userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0'
      }
    }),
    utils = require('utils');
casper.start();
casper.thenOpen('http://www.google.com/', function(response) {
  this.echo(this.getTitle());
});
casper.then(function() {
  casper.page.close();
});
casper.thenOpen('http://www.yahoo.com/', function(response) {
  this.echo(this.getTitle());
});
casper.run(function() {
  console.log('End');
  casper.exit();
});

然而,它给了我一个错误:

Error: cannot access member `customHeaders' of deleted QObject
  test:1182 in open
  test:1555 in _step
  test:1335 in runStep
  test:332 in checkStep

那么,在打开另一个页面之前,如何每次关闭page对象呢?或者更大的问题是如何防止Phantom.js中的内存泄漏?

我不确定我是否完全理解这种情况下发生的事情,但这里有一个解决问题的方法:

...
casper.then(function() {
    casper.page.close();
    casper.page = require('webpage').create();
});
casper.thenOpen('http://www.yahoo.com/', function(response) {
    this.wait(1000, function() {
        this.echo(this.getTitle());
    });
});
...

close()-"关闭页面并释放与其关联的内存堆。调用后不要使用页面实例。"<-这来自phantomjs文档。如果你想继续打开网站,你需要创建一个新的页面实例。希望这能有所帮助!