Как использовать protractor element.all с функцией async / await

== выполняет контрольную проверку равенства, ссылаясь на то, что 2 объекта (строки в этом случае) относятся к одному и тому же объекту в памяти.

Метод equals() будет проверять, будет ли содержимое или состояния двух объектов одинаковы.

Очевидно, что == работает быстрее, но во многих случаях может (может) давать ложные результаты, если вы просто хотите сказать, имеет ли 2 String s тот же текст.

Определенно рекомендуется использовать метод equals().

Не беспокойтесь о производительности. Некоторые способы поощрения использования String.equals():

  1. Реализация String.equals() сначала проверяет ссылочное равенство (используя ==), и если две строки одинаковы по ссылке, дальнейший расчет Выполняется!
  2. Если 2 ссылки на строки не совпадают, String.equals() будет проверять длину строк. Это также является быстрой операцией, поскольку класс String хранит длину строки, не нужно считать символы или кодовые точки. Если длины отличаются, дальнейшая проверка не выполняется, мы знаем, что они не могут быть равными.
  3. Только если мы доберемся до этого, будет фактически сопоставлено содержимое двух строк, и это будет короткий сравнение: не все символы будут сравниваться, если мы найдем несоответствующий символ (в том же положении в 2 строках), никакие другие символы не будут проверены.

Когда все сказано и даже если у нас есть гарантия, что строки являются стажерами, использование метода equals() все еще не является издержками, которые можно было бы подумать, определенно рекомендуемым способом. Если вам нужна эффективная проверка ссылок, используйте перечисления, где гарантируется спецификацией и реализацией языка, что одно и то же значение перечисления будет одним и тем же объектом (по ссылке).

1
задан AMendis 10 March 2019 в 03:44
поделиться

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);
}
}

Тогда как раньше это было

[111 ]

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

0
ответ дан C. Peck 10 March 2019 в 03:44
поделиться

Ответ прост: 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
ответ дан Lunin Roman 10 March 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: