Как использовать protractor element.all в функции aync / await - PullRequest
1 голос
/ 10 марта 2019

Мой код похож на

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 "?

Это мой пакет. 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"
  }

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Ответ прост: element.all имеет свою собственную , затем функцию, объявленную отдельно.

Так что, когда вы сделаете это,

let result = element.all();

Вы получитеElementArrayFinder в результате, как указано в Возвращает раздел.ElementArrayFinder - это объект, который имеет все указанные функции, которые вы хотели get, each и т. Д.

Но если превратить его в обещание,

let result = await element.all();

, тогда онвернет A promise which will resolve to an array of ElementFinders represented by the ElementArrayFinder., что в основном равно ElementFinder[], как указано в Возвращает раздел ElementArrayFinder.prototype.then функции.

0 голосов
/ 10 марта 2019

Какую версию транспортира вы используете? Синтаксис 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>;

Короче говоря, какая у вас версия и помогает ли обновление?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...