В двух предыдущих разделах мы узнали об основах Транспортира и Жасмина. В этой статье мы узнаем о асинхронной природе JavaScript и о том, как транспортир решает асинхронную проблему JS. Давайте углубимся в это.

Эта проблема

Прежде всего, что на самом деле означает утверждение «JavaScript является асинхронным»? Давайте проверим это на примере, а не на некоторых теоретических примерах. Обычно мы говорим синхронно Java, синхронно Python, но не JavaScript, и из-за такой природы JS автоматизация тестирования становится для нас головной болью.

Давайте посмотрим, как асинхронная проблема вживую

поэтому для приведенного выше кода в идеале он должен сначала запустить angularjs, juliemr.github.io, а через 5 секунд скрипт должен распечатать инструкцию в console.log () в конце, но поскольку JS является асинхронным по своей природе, шаги выполнения для этого скрипта полностью случайны.

Процесс будет примерно таким:

При асинхронном выполнении каждый шаг выполняется как поток, который фактически не ждет завершения предыдущего шага, и он будет выполнять следующий шаг, который не зависит от предыдущий шаг. В этом случае последовательность операций - 1 → 2 → 4 → 3, шаг 3 будет выполнен последним, так как он зависит от завершения шага 2.

Решение

Итак, как же решить эту проблему?
Ответ прост, используя обещания…

Каждый шаг JavaScript возвращает обещание, что означает, что он похож на состояние вашего шага. Обещание имеет 3 состояния:

В ожидании

Решено

Отклоненный

Если у вас есть шаг, выполнение которого требует некоторого времени, для этого шага возвращается обещание Pending.. По завершении шага состояние будет разрешено, и любой шаг, который приводит к ошибке, будет иметь состояние отклонено для обещания. Если мы сравним это с Java или Python, пока обещание каждого шага не будет разрешено или отклонено, следующий шаг выполняться не будет. Но в JavaScript его не волнует состояние обещания.

Роль транспортира в исправлении асинхронной

Protractor утверждает, что 90% API в транспортире не будет перемещаться / выполняться на следующий шаг, пока обещание предыдущего шага не будет выполнено. Проще говоря, это означает, что он преобразует асинхронное поведение JavaScript в синхронное и действует идентично выполнению JAVA . Есть еще некоторые API, которые не возвращают обещание, поэтому мы изучаем его здесь 😄. Теперь давайте просто посмотрим на другой пример кода транспортира.

Теперь этот код будет выполняться синхронно. Как? Поскольку sendKeys (), element (), expect () - это API-интерфейсы транспортира, которые заботятся об обещании прямо из коробки.

Но что это за 10%, которые не выполняют обещание?

Давайте сделаем шаг назад и поймем, как Protractor обрабатывает обещания всякий раз, когда в браузере выполняется какое-либо действие, но когда дело доходит до получения чего-либо (данных) из браузера, он не обрабатывает обещания 😞. то есть: getTitle(), getText().

Как выполнить обещания для этих 10%

В вышеупомянутой асинхронной программе мы видели, что строки 3 и 4 выполняются синхронно, но не строка 8. Один из способов утверждать, что это раньше - Protractor API, а позже - JS. Теперь попробуем исправить асинхронную проблему и на JS.

Вы добавляете then() и funtion(), а внутри функции добавляете код, который хотите сделать синхронным.

Вся программа будет выполняться синхронно в следующем порядке
- https://angularjs.org
- http://juliemr.github.io/protractor-demo/, а затем
- console.log(“This should execute last”);.

Это все о том, как обращаться с JavaScript Synchronously with Protractor