Перейти к содержимому

Фотография

[Protractor] Условие по isPresent() в цикле


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 03 октября 2018 - 16:31

Привет, 

 

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

 

//действия по получению массивов allСontrolsToEnable и allControlsToCheck 
//до этого места все работает правильно - массивы содержат нужные элементы 

let elementsToEnable = [];
let elementsToWait = [];

for (let counter = 0; counter < allControlsToCheck.length; counter++){
          controlsOnAC[counter].isPresent().then(function (result) {

                  if (!result) {
                            elementsToEnable.push(allСontrolsToEnable[counter]);
                            elementsToWait.push(allControlsToCheck[counter]);
                            console.log("element in elementsToEnable " + counter + " " + elementsToEnable[counter].locator().toString());
                            console.log("element in elementsToWait " + counter + " " + elementsToWait[counter].locator().toString());
                  }
           });
} 

//some actions
console.log("HERE SHOULD BE FULL ARRAY LENGTH = " + elementsToEnable.length);
console.log("HERE SHOULD BE FULL ARRAY LENGTH = " + elementsToWait.length)

 

После этой функции там происходят примерно такие действия: нажать на UI кнопочку, в открывшейся панельке прокликать элементы из массива elementsToEnable, дождавшись появления на UI элементов из elementsToWait, закрыть панельку. 

 

И вот в эти дальнейшие действия массивы elementsToEnable и elementsToWait передаются пустыми, а сообщеньки про длину (которые капслоком) в консоли отображаются перед теми, что внутри цикла (но они потом выводят верное содержимое новых массивов), т.е. получается как-то так, что сперва проделываются все остальные действия, а уж потом программа идет в этот цикл (или в этот промис). 

 

Подскажите, пожалуйста, как написать правильно, у меня видимо какой-то пробел насчет промисов здесь :( 


  • 0

#2 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 04 октября 2018 - 08:43

не дает отредактировать тему  :rtfm: я упростила немного код, чтобы он лучше читался вне контекста, в условии промиса опечатка, должно быть 

allControlsToCheck[counter].isPresent().then(function (result) {

  • 0

#3 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 08 октября 2018 - 09:45

Я бы прошла дебаггером прямо по шагам.

 

1. Так и задумано, что из изначального массива элементы при !result кладутся сразу в оба списка (и тот, что содержит элементы, которые уже есть, и в тот, где элементы, которые надо подождать)?

2. У Вас изначально два массива, перебор идет по длине allControlsToCheck, условие также по allControlsToCheck, а элементы добавляете в т.ч. из allСontrolsToEnable. Почему если allControlsToCheck[x] присутствует, то запомнить надо не только этот элемент, но и allСontrolsToEnable[x], хотя это скорее всего совершенно разные элементы? Какая тут связь?


  • 1

#4 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 10 октября 2018 - 12:44

Я бы прошла дебаггером прямо по шагам.

 

1. Так и задумано, что из изначального массива элементы при !result кладутся сразу в оба списка (и тот, что содержит элементы, которые уже есть, и в тот, где элементы, которые надо подождать)?

2. У Вас изначально два массива, перебор идет по длине allControlsToCheck, условие также по allControlsToCheck, а элементы добавляете в т.ч. из allСontrolsToEnable. Почему если allControlsToCheck[x] присутствует, то запомнить надо не только этот элемент, но и allСontrolsToEnable[x], хотя это скорее всего совершенно разные элементы? Какая тут связь?

Спасибо за ответ!

 

Я пока что решила проблему иначе (перестроила алгоритм так, чтобы обойтись без IsPrersent(), не слишком красиво, но в принципе работает).

 

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

По поводу моей функции - это для включения в гриде отсутствующих колонок (кастомизация, ну вот в джире на выводе результатов запроса такое есть, если мне память не изменяет). Т.е. открой панель настройки, прощелкай элементы, которые надо включить (в массиве ElementsToEnable), и дождись, чтобы они появились на гриде (ElementsToWait), после этого переходи к следующим действиям в тесте.

 

Элементы из пар массивов четко связаны друг с другом, они формируются в предыдущих действиях функции и подперты проверками. Перед переходом к циклу стоит проверка, чтобы длины массивов были равны. А это только ее фрагмент, не стала просто тему загромождать.


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных