Как использовать транспортир element.all в функции aync/await

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

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"
  }
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
1
0
1 748
2

Ответы 2

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

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

Это мой package.json, я использую транспортир 5.4.2 "devDependencies": { "@types/jasmine": "^3.3.5", "@types/node": "^10.12.18", "транспортир" : "^ 5.4.2", "машинопись": "^ 3.2.2" }, "зависимости": { "@types/jasmine-data-provider": "^ 2.2.1", "jasmine-data-provider" : "^2.2.0", "транспортир-жасмин2-html-репортер": "0.0.7" }

AMendis 10.03.2019 04:31

Черт, я думал, что он у меня есть. Вы можете попробовать добавить promise.USE_PROMISE_MANAGER = false перед функцией, которая вызывает element.all или element.each, а затем promise.USE_PROMISE_MANAGER = true. Я не знаю, повлияет ли это на ваш код, но это может решить эту проблему.

C. Peck 10.03.2019 05:07

Ответ прост: у 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.

Другие вопросы по теме