如何在ProtractorJS中扩展ElementFinder对象?

时间:2016-02-29 21:15:47

标签: javascript angularjs protractor

在使用protractorJS进行的一些实验中,我注意到没有简单的方法可以从量角器扩展(继承)ElementFinder对象来添加自己的函数。

例如,我想创建对象Checkbox,这将有额外的方法 - check() - 应根据isSelected()的结果切换复选框。

我想出了代码 -

var ElementFinder = require('protractor/lib/element.js').ElementFinder;
var ElementArrayFinder = require('protractor/lib/element.js').ElementArrayFinder;

class CheckBox extends ElementFinder {
    constructor(loc) {
      var getWebElements = function () {
        var ptor = browser;
        var locator = loc;
        return ptor.waitForAngular().then(function() {
          if (locator.findElementsOverride) {
            return locator.findElementsOverride(ptor.driver, null, ptor.rootEl);
          } else {
            return ptor.driver.findElements(locator);
          }
        });
      }
  var ArrayFinderFull = new ElementArrayFinder(browser, getWebElements, loc);
  super(browser, ArrayFinderFull);
}

    check() {
    return this.isSelected().then(selected => selected? this.click() : null)
    }
}

但getWebElements是protractor / element.js的复制粘贴 - https://github.com/angular/protractor/blob/3.1.0/lib/element.js#L131

这个复制粘贴让我感到震惊。我认为应该有更合适的方法来扩展ElementFinder。

有没有人在protractorJS中继承了ElementFinder?

2 个答案:

答案 0 :(得分:4)

我不确定这会有所帮助,但- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static int counter = 0; NSString *identifier = [NSString stringWithFormat:@"Identifier_%d", counter]; [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:identifier]; UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; counter++; // ... // ... // ... } takewhile()方法ElementArrayFinder可以使用onPrepare()方法。我们已将以下内容放入protractor.ElementArrayFinder.prototype.takewhile = function(whileFn) { var self = this; var getWebElements = function() { return self.getWebElements().then(function(parentWebElements) { var list = []; parentWebElements.forEach(function(parentWebElement, index) { var elementFinder = protractor.ElementFinder.fromWebElement_(self.ptor_, parentWebElement, self.locator_); list.push(whileFn(elementFinder, index)); }); return protractor.promise.all(list).then(function(resolvedList) { var filteredElementList = []; for (var index = 0; index < resolvedList.length; index++) { if (!resolvedList[index]) { break; } filteredElementList.push(parentWebElements[index]) } return filteredElementList; }); }); }; return new protractor.ElementArrayFinder(this.ptor_, getWebElements, this.locator_); };

takewhile

现在我们可以对element.all()

的结果使用element.all(by.repeater("row in rows")).takewhile(function (elm) { return elm.getText().then(function (text) { return some_condition_to_be_true; }); });
{{1}}

答案 1 :(得分:0)

现在扩展ElementFinder要简单得多,我称之为 - 页面片段。

我甚至创建了lib来解决这个问题(PR欢迎!) - https://github.com/Xotabu4/protractor-element-extend

目前它只适用于ElementFinder,但我希望能够扩展 ElementArrayFinders也是(计划用于2.0.0版本)

更新

添加了对ElementArrayFinder继承的支持。