Phantomjs / Node.js - 重构代码块

时间:2015-04-02 12:58:30

标签: node.js refactoring phantomjs

我正在为我工​​作的公司编写一个测试应用程序,使用Node.js和Phantomjs。现在,我的代码的相关部分是这样的:

phantom.create(function (ph) {
        ph.createPage(function (page) {
                page.set('viewportSize', { width: 1920, height: 1080 });
                page.set('settings.javascriptEnabled', true);
                page.set('settings.loadImages', true);
                page.set('settings.localToRemoteUrlAccess', true);
                page.set('settings.userAgent', userAgentStrings[randomInt(0, 5)]);
                page.set('settings.webSecurityEnabled', false);
                page.set('settings.resourceTimeout', 5000);

                page.open(URL, function (status) {
                        if (status == 'success') {
                                page.evaluate(function (result) {
                                        return document.title;
                                }, function (result) {
                                        setTimeout(function () {
                                                log.info('Status: ', status);
                                                ph.exit();
                                        }, 60 * 1000);
                                });
                        } else if (status == 'fail') {
                                log.error('Status: ', status);
                                ph.exit();
                        }
                });
        });
});

我的问题是:有没有办法以这样的方式重构我的代码,我可以在“phantom.create(...”块?之外调用“page.open(...”函数) / p>

我计划实现node-cron,并且有一个代码块,我设置了页面的所有选项,另一个我将用来打开页面。最后,开放部分将由node-cron处理,无限重复。

1 个答案:

答案 0 :(得分:2)

以下是如何执行此操作的快速示例。您只需将幻像对象存储在某处并重复使用即可。请注意,我这样做很简单,您可以重用该概念,但需要更多的错误处理。

var jobRunner = function() {
  // The phantom object will be stored here
  this.ph;

  // The page object will be stored here
  this.page;
};

jobRunner.prototype.start = function(readyCallback) {
  var self = this;

  phantom.create(function (ph) {
    self.ph = ph;
    self.ph.createPage(function (page) {
      page.set('viewportSize', { width: 1920, height: 1080 });
      page.set('settings.javascriptEnabled', true);
      page.set('settings.loadImages', true);
      page.set('settings.localToRemoteUrlAccess', true);
      page.set('settings.userAgent', userAgentStrings[randomInt(0, 5)]);
      page.set('settings.webSecurityEnabled', false);
      page.set('settings.resourceTimeout', 5000);

      self.page = page;
      readyCallback();
    });
  });
};

jobRunner.prototype.doUrl = function(url) {
  var self = this;
  this.page.open(URL, function (status) {
    if (status == 'success') {
      page.evaluate(function (result) {
        return document.title;
      }, function (result) {
        setTimeout(function () {
          log.info('Status: ', status);
          self.ph.exit();
        }, 60 * 1000);
      });
    } else if (status == 'fail') {
      log.error('Status: ', status);
      self.ph.exit();
    }
  });
}

var CronJob = require('cron').CronJob;
var phantomJob = new jobRunner();

// Wait for Phantom to be ready then start the Cron Job.
phantomJob.start(function() {
  var cron = new CronJob('*/5 * * * * *', function() {
    phantomJob.doUrl("http://yoururl.com");
  });
});