有没有办法使用量角器filter
接受一个返回量角器自己的Promise类型的函数,我自己的函数返回原生Promise?
const myFilter = async(e: ElementFinder): Promise<boolean> => {
...
}
myElements.filter(myFilter)
这会引发TypeScript编译错误
顺便说一句,由于贬低(https://github.com/SeleniumHQ/selenium/issues/2969),我自己无法创造量角器的承诺TS2345:类型'(e:ElementFinder)的参数=&gt; &gt; Promise'不能分配给''类型的参数(元素:&gt; ElementFinder,index?:number)=&gt;布尔值|诺言'。 类型'Promise'不能赋值为'boolean |诺言'。 “承诺”类型不能分配给“promise.Promise”类型。 “承诺”类型中缺少“取消”属性。
答案 0 :(得分:0)
我只是遇到了这个问题,无法创建一个实现量角器承诺并返回本地Promise的函数。因此,我认为答案是否。
我最终得到的解决方案是创建一个同步函数,如下所示:
export function filterBy(elements: ElementArrayFinder, locator: By | Locator | ProtractorLocator): ElementArrayFinder {
return elements.filter((element: ElementFinder) => element.element(locator).isPresent());
}
用法如下:
let elements = element.all(by.css('CSS_RULE'));
let filtered = filterBy(elements, by.css('CHILD_CSS_RULE'));
我花了一天多的时间来获取返回本地Promise的功能,但无法使其正常工作。 但是此功能应该可以满足您的需求。
答案 1 :(得分:0)
好吧,如果这仍然有意义,那么我必须再次进行测试,这次我立刻找到了解决方案。
这些帮助者打开了protractor.promise.Promise
与本机Promise
之间的桥梁。
const toNativePromise = <T = void>(p: protractor.promise.Promise<T>): Promise<T> => {
return new Promise((res, rej) => {
p.then(res).catch(rej)
})
}
const toProtractorPromise = <T = void>(native_promise: Promise<T>): protractor.promise.Promise<T> => {
const deferred = protractor.promise.defer<T>();
const protractorPromise = deferred.promise;
native_promise.then(deferred.fulfill).catch(deferred.reject)
return protractorPromise
}
无论如何,要解决您的第一个问题,您可以编写如下内容:
const myFilter = async(e: ElementFinder): Promise<boolean> => { ... }
const myFilterForProtractor = (e) => toProtractorPromise(myFilter(e))