对同一个幻像实例使用createPage()两次

时间:2015-02-16 20:07:22

标签: javascript node.js phantomjs mocha

我尝试使用PhantomJS设置mocha测试,但我遇到了一个问题,我无法使用相同的幻像实例来创建多个页面。第一个测试用例运行得很好,但第二个测试用例超时。我只想使用一个实例,因为它应该更快。

var assert = require('assert');
var phantom = require('phantom');
var path = require('path');

var ph;

describe('document', function() {
    before(function(done) { // Create only one phantom instance for the whole suite
        this.timeout(10000); // Prevent test case from aborting while phantom loads
        phantom.create(function(p) {
            ph = p;
            done();
        }, {
            dnodeOpts: {weak: false}
        });
    });

    it('should have a title', function(done) {
        ph.createPage(function(page) {
            var url = 'file:///' + path.resolve(__dirname + '/index.html');
            page.open(url, function(status) {
                page.evaluate(function() {
                    return document.title;
                }, function(title) {
                    assert.equal('This is a title', title);
                    ph.exit();
                    done();
                });
            });
        });
    });

    it('should have the same title', function(done) {
        ph.createPage(function(page) {
            var url = 'file:///' + path.resolve(__dirname + '/index.html');
            page.open(url, function(status) {
                page.evaluate(function() {
                    return document.title;
                }, function(title) {
                    assert.equal('This is a title', title);
                    ph.exit();
                    done();
                });
            });
        });
    });
});

为什么第二次不打开页面?

1 个答案:

答案 0 :(得分:1)

您在第一次测试后退出PhantomJS,因此第二次测试失败。所有测试后,您只需运行一次ph.exit();。我怀疑这可以通过以下方式完成:

describe('document', function() {
  before(...);
  after(function(done) {
    ph.exit();
    done();
  });
  it(...);
  it(...);
});

createPage期间你可能会before,并且在测试中使用page实例。每个测试用例仍然应该打开一个新的URL,以便呈现一个新的DOM。这可能会更快,更有弹性抵御内存泄漏。

顺便说一句,PhantomJS'永远不会清除localStorage(因为它存储在磁盘上),因此您必须在每个测试用例之后或执行结束时自行清除它。
PhantomJS每个进程只有一个CookieJar(仅在内存中),因此如果您测试登录或类似内容,则必须删除cookie。