在量角器中使用本机承诺

时间:2017-07-27 10:09:28

标签: typescript protractor

有没有办法使用量角器filter接受一个返回量角器自己的Promise类型的函数,我自己的函数返回原生Promise?

const myFilter = async(e: ElementFinder): Promise<boolean> => {
...
}
myElements.filter(myFilter)

这会引发TypeScript编译错误

  

TS2345:类型'(e:ElementFinder)的参数=&gt; &gt; Promise'不能分配给''类型的参数(元素:&gt; ElementFinder,index?:number)=&gt;布尔值|诺言'。    类型'Promise'不能赋值为'boolean |诺言'。      “承诺”类型不能分配给“promise.Promise”类型。        “承诺”类型中缺少“取消”属性。

顺便说一句,由于贬低(https://github.com/SeleniumHQ/selenium/issues/2969

,我自己无法创造量角器的承诺

2 个答案:

答案 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))