【问题标题】:Protractor: classes inheritance量角器:类继承
【发布时间】:2015-11-07 08:56:23
【问题描述】:

我有 3 级继承类: 第一类继承ElementArrayFinder,第二类继承第一类。这是我的代码:

一级:

 var util = require('util');
 var ElementArrayFinder = require('C:/Users/Lilia.Sapurina/AppData/Roaming/npm/node_modules/protractor/lib/element').ElementArrayFinder;

 var psComponent = function() {};

 util.inherits(psComponent, ElementArrayFinder);

 module.exports = psComponent;

二级:

var util = require('util');
var psComponent = require('../lib/psComponent');

var psDateTimePicker = function() {};

util.inherits(psDateTimePicker, psComponent);

psDateTimePicker.prototype.getField = function() {
  return element(by.xpath('//div[1]/table/tbody/tr[2]/td[1]/div/input'));
};

psDateTimePicker.prototype.getButton = function() {
  return element(by.css('td > a.b-button.b-button_only_icon'));
};

exports.psDateTimePicker = new psDateTimePicker();

我可以这样在我的代码中使用它:

  fdescribe('lala', function () {

     var psDateTimePicker = require('../lib/psDateTimePicker').psDateTimePicker;

    beforeEach(function(){
      browser.get('ng-components/examples/ps-date-time-picker.html');
    });

    it('test', function () {
             expect(psDateTimePicker.getField().getAttribute("value")).toEqual(6);

  });
});

但我想制作全局接口并使代码构造看起来像:

fdescribe('lala', function () {

  var psComponents = require('../lib/psComponent');

  beforeEach(function(){
    browser.get('ng-components/examples/ps-date-time-picker.html');
  });

  it('test', function () {
       expect(psComponents.psDateTimePicker.getField().getAttribute("value")).toEqual(6); 
  });
});

有人知道我可以如何组织它吗?我尝试使用 getInstanceOf(),但它不起作用。也不是很方便。

【问题讨论】:

    标签: angularjs node.js protractor prototypal-inheritance


    【解决方案1】:

    不完全确定您在寻找什么,但可能是这些方面的东西......?

    var util = require('util');
    var ElementArrayFinder = require('C:/Users/Lilia.Sapurina/AppData/Roaming/npm/node_modules/protractor/lib/element').ElementArrayFinder;
    var psDateTimePicker = require('../lib/psDateTimePicker').psDateTimePicker;
    
    var PsComponent = function() {};
    
    util.inherits(PsComponent, ElementArrayFinder);
    
    PsComponent.prototype = util;
    PsComponent.prototype = psDateTimePicker;
    module.exports = new PsComponent();
    

    那么……

    describe('lala', function () {
      var psComponents = require('../lib/psComponents');
    
      beforeEach(function(){
        browser.get('ng-components/examples/ps-date-time-picker.html');
      });
    
      it('test', function() {
        expect(psComponents.getField().getAttribute("value")).toEqual(6); 
      });
    });
    

    【讨论】:

    • 是的,我认为这不是我想要的。但谢谢你的有趣想法。我可以问你这两行:'PsComponent.prototype = util; PsComponent.prototype = psDateTimePicker;'我们真的可以这样做吗?不是覆盖PsComponent.prototype吗?
    • 是的,女士。这就是您可以将各种模块继承到另一个模块中的方式。例如,我使用此模式将我的 basePage 扩展到我的页面对象的其余部分(您可以在 GitHub 上的 protractor_example 项目中看到它:bit.ly/1ICQDdi
    【解决方案2】:

    如果你想为你的所有组件创建一个命名空间,你可以创建一个额外的模块来负责:

    // psComponents.js
    module.exports = {
        psDateTimePicker: require('../lib/psDateTimePicker').psDateTimePicker,
        psAnotherComponent: require('../lib/psAnotherComponent').psAnything
    };
    

    并按照您想要的方式使用它:

    var psComponents = require('../lib/psComponents');
    expect(psComponents.psDateTimePicker.getField().getAttribute("value")).toEqual(6);
    

    这比您尝试做的简单得多 - 尝试从父级访问子级 - 没有简单的方法来实现它,通常也没有理由这样做。原型只是创建新的独立实例的样板,它们不应该相互连接。原型继承几乎相同:您只需扩展该样板,但子实例和父实例将保持独立。

    【讨论】:

    • 很好,迈克尔!我比我的回答更喜欢这个:)
    猜你喜欢
    • 2014-02-23
    • 2015-12-09
    • 2018-08-13
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多