gpt4 book ai didi

javascript - 如何在 ProtractorJS 中扩展 ElementFinder 对象?

转载 作者:数据小太阳 更新时间:2023-10-29 06:15:30 26 4
gpt4 key购买 nike

在使用 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?

最佳答案

我不确定这是否有帮助,但这是 something we did recentlyElementArrayFinder 上使用 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;
});
});

关于javascript - 如何在 ProtractorJS 中扩展 ElementFinder 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35709805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com