【问题标题】:How to share data between javascript files?如何在javascript文件之间共享数据?
【发布时间】:2014-11-20 02:11:47
【问题描述】:

我(我认为)js 有一种独特的问题。我正在使用量角器和 Jasmine 编写测试,我需要在 js 文件之间共享数据。有没有办法做到这一点?我找到的所有解决方案都是针对网页的,我只使用 js 文件。

期待您的快速回复,如果有任何信息缺失,请告诉我,我会立即补充。

【问题讨论】:

  • 我还没用过量角器,但是有了karma和jasmine,你可以使用requirejs来共享数据。如果你愿意,我可以提供更多细节。
  • 据我所知,我只能使用:Protractor API、Selenium API、Jasmine、JS。这不是我的私人项目,所以很遗憾我不能使用其他东西。除非,我理解错了,这是“内置”js。 @Edit:等等,你的意思是 requirejs 内置在 Jasmine 中?如果是,那么一定要详细说明。
  • 不,requirejs 是一个独立的库requirejs.org
  • 那真是太可惜了。还是谢谢!
  • 否则。也许您可以在第一次测试中将您的数据声明为全局变量,然后其他测试可以读取它。不过,我不能 100% 确定它会起作用。

标签: javascript jasmine protractor


【解决方案1】:

我自己没有对此进行测试,但也许您可以尝试使用以下方法将内容放入全局范围:

global.mySharedData = {someKey: 'some value'}

// in one of your test files
it('should do something', function() {
  global.mySharedData = {someKey: 'some value'}
});

...

// This is in another test suite
it('should do something', function() {
  var valueFromFirstTest = global.mySharedData.someKey;
});

http://nodejs.org/api/globals.html

让我知道它是否有效。

【讨论】:

  • 我喜欢它,简单有效的Andres!。好奇:为什么不使用browser.params 而不是全局?我实际上使用了这两种方法:browser.params 用于不可变的共享测试配置数据,而global.testState 当我需要获取诸如元素的 x,y 位置之类的运行测试数据以测试调整它的大小时。
  • Andres,顺便说一句,protractor 标签中有很多未解答的问题,希望您能经常出现并在这里提供帮助。另外,我怎样才能得到像你在聚会上穿的那样的量角器 T 恤? :)
  • Holly molly,它确实有效。非常感谢!如此简单的解决方案。
  • @LeoGallucci 我通常通过量角器的 rest api 调用来提取我需要的数据。我没有使用 browser.params 因为我使用标志,但这是一个很好的提示!
  • 我在 Jasmine 中使用了 global['myVariable] ,它适用于来自declare var的变量
【解决方案2】:

如果您需要在文件之间共享动态数据,您还可以执行以下操作。 这是一个工作示例。我需要做的是获取 URL 的一部分并在不同的文件中使用它们。

it('should click on one of the clickable profiles', function(){

        //Get entity type and entity id before clicking the link
        tableEls.get(1).all( by.xpath('./td') ).get(0).element( by.xpath('./a') ).getAttribute('href').then(function(text){

            var hrefTokens  = text.split('/');
            var entityID    = hrefTokens[ hrefTokens.length - 1 ];
            var entityType  = hrefTokens[ hrefTokens.length - 2 ];

            browser.params.entityID   = entityID;
            browser.params.entityType = entityType;
        });

        tableEls.get(1).all( by.xpath('./td') ).get(0).element( by.xpath('./a') ).click();
        browser.sleep(2000);
    });

我只是将需要在其他文件中使用的值分配给browser.params。所以在我的其他文件中,我可以像这样访问它们

    it('Retrieving JSON Data ...', function(){

        var entityID   = browser.params.entityID;
        var entityType = browser.params.entityType;
   });

【讨论】:

  • @Nice 和简单的解决方案!
【解决方案3】:

有一种简单的方法可以在 Protractor 规范 JavaScript 文件之间共享数据甚至函数。它们在 node.js 中运行,并以一种内置方式来定义模块以及使用和重用它们 - http://nodejs.org/docs/latest/api/modules.html

假设以下文件夹的结构:

o e2e
|-- utils.js
|-- a-spec.js
|-- b-spec.js

utils.js:

exports.sharedData = { num: 42, str: 'hi' };
exports.foo = function (x) { return x + 1; };

a-spec.js:

var utils = require('./utils.js'); // Note './'

describe("The a page", function () {
    it("should give the ultimative answer", function () {
        expect(element(by.binding("answer")).getTest())
            .toBe(utils.sharedData.num); // Using shared data
    });
});

【讨论】:

    【解决方案4】:

    我将它包含在我的配置 js 文件中,我在其中为量角器声明了我的变量。

    (function () {
        this.defaultPassword = function () {
            return 'superPassword';
        };
    }());
    

    在其他文件中的用法如下:

    var userLogin = { 'Email': 'something@gmail.com', 'Password': defaultPassword },
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2021-09-16
      • 1970-01-01
      • 2020-08-31
      • 2010-11-24
      • 2021-10-12
      • 2016-06-23
      相关资源
      最近更新 更多