如何在ProtractorJS中扩展ElementFinder对象?

6
在使用 ProtractorJS 进行一些实验时,我注意到没有一种简单的方法可以扩展(继承)来自 protractor 的 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吗?


你解决了这个问题吗?我需要实现同样的功能。 - shiva
@shiva,部分地。请看我下面关于我创建的库的答案。你可以在那里找到代码示例。 - Xotabu4
2个回答

5

我不确定这是否有帮助,但以下是我们最近所做的内容,以便在ElementArrayFinder上有一个takewhile()方法可用。 我们将以下内容放入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_);
};

现在我们可以对element.all()的结果使用takewhile

element.all(by.repeater("row in rows")).takewhile(function (elm) {
    return elm.getText().then(function (text) {
        return some_condition_to_be_true;
    });
});

2
现在扩展ElementFinder变得更加简单了,我称之为页面片段。
我甚至创建了一个库来解决这个问题(欢迎提交PR!)- https://github.com/Xotabu4/protractor-element-extend 目前它只适用于ElementFinder,但我也想扩展ElementArrayFinders(计划在2.0.0版本中实现)
更新:
已添加对ElementArrayFinder继承的支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接