1

我的代码就像

async function myTestFunc(){
               let items:ElementArrayFinder = await element.all( by.xpath("./li"));
}

该代码给出以下错误

'items' is declared but its value is never read.ts(6133)
Type 'any[] | ElementFinder[]' is not assignable to type 'ElementArrayFinder'.
Type 'any[]' is missing the following properties from type 'ElementArrayFinder': browser_, getWebElements, locator_, actionResults_, and 35 more

文档说“ element.all”返回“ ElementArrayFinder”。

但是当element.all在 async/await 函数中使用“”时,它似乎正在返回“ ElementFinder[]”。

这怎么可能?因此,我不能在“”中使用“ each()”或“ ”之类的方法。get()ElementArrayFinder

element.all在“”中使用“”的最佳方法是什么ElementArrayFinder

这是我的 package.json

"devDependencies": {
    "@types/jasmine": "^3.3.5",
    "@types/node": "^10.12.18",
    "protractor": "^5.4.2",
    "typescript": "^3.2.2"
  },
  "dependencies": {
    "@types/jasmine-data-provider": "^2.2.1",
    "jasmine-data-provider": "^2.2.0",
    "protractor-jasmine2-html-reporter": "0.0.7"
  }
4

2 回答 2

0

你用的是什么版本的量角器?该ElementFinder[]语法由量角器在内部使用,并且必须以某种方式偷偷溜出。这是 5.2.0 中的一个问题,但我相信它已在当前版本 (5.4.2) 中修复。如果您查看源代码,处理此问题的函数发生了变化,从第 550 行开始

* @param {function(Array.<ElementFinder>)} fn
* @param {function(Error)} errorFn
*
* @returns {!webdriver.promise.Promise} A promise which will resolve to
*     an array of ElementFinders represented by the ElementArrayFinder.
*/
then<T>(
    fn?: (value: ElementFinder[] | any[]) => T | wdpromise.IThenable<T>,
    errorFn?: (error: any) => any): wdpromise.Promise<T> {
      if (this.actionResults_) {
      return this.actionResults_.then(fn, errorFn);
} else {
  return this.asElementFinders_().then(fn, errorFn);
}
}

而它曾经只是

@param {function(Array.<ElementFinder>)} fn
* @param {function(Error)} errorFn
*
* @returns {!webdriver.promise.Promise} A promise which will resolve to
*     an array of ElementFinders represented by the ElementArrayFinder.
*/
then<T>(fn?: (value: ElementFinder[] | any[]) => T | wdpromise.IThenable<T>, 
errorFn?: (error: any) => any): wdpromise.Promise<T>;

长话短说,您使用的是什么版本,升级有帮助吗?

于 2019-03-10T03:01:17.663 回答
0

答案很简单:element.all有自己的then函数,单独声明。

所以当你这样做的时候

let result = element.all();

您将得到ElementArrayFinder结果,如退货部分中指定的那样。ElementArrayFinder是一个对象,它具有您想要的所有指定功能geteach等等。

但如果把它变成一个承诺,

let result = await element.all();

然后它将返回A promise which will resolve to an array of ElementFinders represented by the ElementArrayFinder.,这基本上与函数的Returns部分中ElementFinder[]指定的一样。ElementArrayFinder.prototype.then

于 2019-03-10T07:51:29.940 回答