在使用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?
答案 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继承的支持。