Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用casper.page.close()避免多页打开时的内存泄漏_Javascript_Node.js_Web Scraping_Phantomjs_Casperjs - Fatal编程技术网

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

Javascript 如何使用casper.page.close()避免多页打开时的内存泄漏,javascript,node.js,web-scraping,phantomjs,casperjs,Javascript,Node.js,Web Scraping,Phantomjs,Casperjs,当我在一个数组中打开多个页面(以千为单位)时,似乎存在内存泄漏,因为我在Windows中监视进程内存 我读了这篇文章,决定使用 下面是代码 var casper = require("casper").create({ verbose: true, logLevel: 'debug', pageSettings: { userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/2

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

我读了这篇文章,决定使用

下面是代码

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

那么,每次打开另一个页面之前,如何关闭
页面
对象?或者更大的问题是如何防止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()-“关闭页面并释放与其关联的内存堆。调用此函数后不要使用页面实例。”它不起作用,因为在执行capture()时,yahoo页面为空。谷歌页面还不错,也许你等的时间不够长。我的是空白的,如果我不等待一秒钟,但它可能需要更长的时间。[debug][phantom]打开url:,HTTP获取[debug][phantom]成功注入Casper客户端实用程序[info][phantom]步骤5/5:在726ms内完成。[信息][幻影]步骤6/6:在822毫秒内完成。[info][phantom]等待()已完成1000毫秒的等待。[debug][phantom]已成功注入Casper客户端实用程序Yahoo!加拿大[info][phantom]在1870年完成了6个步骤这可能是事实,但是否有办法避免猜测等待号码?@HP。您可以使用任何
waitFor…()
方法、等待资源、选择器。。。或者使用
waitFor()
创建您自己的等待逻辑是否有更新?你是如何解决问题的?