Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.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 对同一幻影实例使用createPage()两次_Javascript_Node.js_Phantomjs_Mocha.js - Fatal编程技术网

Javascript 对同一幻影实例使用createPage()两次

Javascript 对同一幻影实例使用createPage()两次,javascript,node.js,phantomjs,mocha.js,Javascript,Node.js,Phantomjs,Mocha.js,我试图用PhantomJS设置mocha测试,但遇到了一个问题,无法使用同一个PhantomJS实例创建多个页面。第一个测试用例运行正常,但第二个测试用例超时。我只想使用一个实例,因为它应该更快 var assert = require('assert'); var phantom = require('phantom'); var path = require('path'); var ph; describe('document', function() { before(fun

我试图用PhantomJS设置mocha测试,但遇到了一个问题,无法使用同一个PhantomJS实例创建多个页面。第一个测试用例运行正常,但第二个测试用例超时。我只想使用一个实例,因为它应该更快

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();
                });
            });
        });
    });
});

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

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

describe('document', function() {
  before(...);
  after(function(done) {
    ph.exit();
    done();
  });
  it(...);
  it(...);
});
您甚至可以在
之前的
期间
创建页面
,并在测试中使用
页面
实例。每个测试用例仍然应该打开一个新的URL,以便呈现一个新的DOM。对于内存泄漏,这可能会更快、更具弹性

顺便说一下,PhantomJS的
localStorage
永远不会被清除(因为它存储在磁盘上),所以您必须在每个测试用例之后或在执行结束时自己清除它。

PhantomJS每个进程也只有一个CookieJar(仅在内存中),因此如果您测试登录或类似的内容,您必须删除Cookie。

测试用例将修改DOM,因此我应该使这些用例独立于执行顺序,并每次重新加载页面。否,您只需全局管理
页面
实例。每个
it
都必须重新打开url。顺便说一句,PhantomJS的本地存储永远不会被清除,因此您必须在每个测试用例之后或在执行结束时自己清除它。PhantomJS每个进程也只有一个CookieJar,所以如果您测试登录或类似的东西,就必须删除Cookie。哦,我明白了,我错过了。