транспортир, петля элементов

Я новичок в транспортире. Я делаю автоматические тесты, и в моем файле функций я должен это проверить:

When('there are at least two ports loaded', function (next) { }

В моем html у меня есть это:

<div class="port-element ">
   <div class="image-loader" style="display: inline;">
      <picture> (...) </picture>

Я пытаюсь сделать цикл, чтобы проверить это, но, возможно, я действительно не понимаю, как это сделать:

let port_element = element.all(by.css('port-element '));
      port_element.each(function (item) { 
        console.log('Port element count: ', item);
      });
      next();

но я не понимаю как.

По совету я использовал это в своем шаге:

let count = await element.all(by.css('.port-element')).count();
for(let i=1;i<=count;i++)
{
  let selector = 'div.port-element div.image-loader:nth-child('+i+')');
  //selector is the element within each div to now check
}

а также

ожидать (element.all (by.css ('div.port-item div.image-loader')). count ()). to.be.above (2)

но у меня сейчас такая ошибка:

AssertionError: expected ManagedPromise::4833 {[[PromiseStatus]]: "pending"} to be a number or a date

Сейчас попробовал сделать так:

let img_loader_count = element.all(by.css('div.port-element div.image-loader'));
    console.log('img loader count: ', img_loader_count.count());                  

но у меня на консоли это: img loader count: 0

Есть 12 загрузчиков img, так что это невозможно. Почему на консоли печатает 0? Кто-нибудь может мне помочь?

Спасибо.


person Spicchio    schedule 11.06.2018    source источник


Ответы (2)


Единственный способ, который я видел, это использовать element.count() в качестве индекса для цикла, такого как:

let count = await element.all(by.css('.port-element')).count();
for(let i=1;i<=count;i++)
{
  let selector = 'div.port-element div.image-loader:nth-child('+i+')');
  //selector is the element within each div to now check
}

Однако, если вы только пытаетесь проверить наличие определенного количества изображений внутри элемента порта, вы можете сделать

expect(element.all(by.css('div.port-element div.image-loader').count()).toBe(2);

Редактирование вопроса:
Вы должны использовать expect() вместо console.log(). Асинхронный характер js может привести к странным вещам, когда вы пытаетесь регистрировать подобные переменные, поскольку он не заключен в обещание. Использование expect(img_loader_count.count()).toBe(12); должно дать вам ожидаемый результат. Если вам нужно использовать console.log() по какой-либо причине, вы должны правильно поставить его в очередь, например:

element.all(by.css('div.port-element div.image-loader').count().then(function(value){
  console.log('The count is: '+value);
});

Здесь приведена документация для некоторых из обещанного материала.

person Ben Mohorc    schedule 11.06.2018
comment
Бен, не знаю почему, но теперь у меня такая ошибка: TypeError: by.css(...).count is not a function - person Spicchio; 12.06.2018
comment
изменяя порядок скобок, он возвращает эту ошибку: AssertionError: ожидаемое ManagedPromise::4833 {[[PromiseStatus]]: pending} должно быть числом или датой - person Spicchio; 12.06.2018
comment
@Spicchio Трудно сказать без хорошего примера. Если бы вы могли задать новый вопрос или добавить его к этому вопросу, я был бы рад помочь. - person Ben Mohorc; 12.06.2018
comment
@Spicchio Используйте только последнюю часть моего ответа. Первая часть отвечает на технический вопрос о том, как перебирать элементы, но я не считаю, что это необходимо для решения вашей проблемы. Я немного неправильно понял вопрос. Это были два разных способа решения проблемы, и их нельзя было использовать одновременно. - person Ben Mohorc; 12.06.2018
comment
Спасибо за ваш ответ. К сожалению, ошибка та же, что я добавил в свой вопрос: AssertionError: ожидается, что ManagedPromise::4827 {[[PromiseStatus]]: pending} будет числом или датой - person Spicchio; 12.06.2018
comment
Странный. Он должен быть почти таким же, как ответ Акаша, только с другим селектором CSS. Может быть, попробовать его синтаксис, но просто использовать 'div.port-element div.image-loader' для селектора? Я привык к жасминовому фреймворку, поэтому всегда возможна небольшая синтаксическая ошибка, если вы прямо копируете и вставляете. Я не знаю, что меняется в огурце, а что остается - person Ben Mohorc; 12.06.2018
comment
Привет @Ben Mohorc, я отредактировал свой вопрос с обновлениями! Пожалуйста, проверьте это и дайте мне совет. Спасибо - person Spicchio; 13.06.2018
comment
@Spicchio Надеюсь, этот последний ответ поможет. Если у вас все еще есть проблемы, я бы подумал о том, чтобы задать новый вопрос, поскольку теперь он все дальше отходит от исходного вопроса. - person Ben Mohorc; 13.06.2018

Вы можете использовать count(), чтобы проверить, сколько классов загружено на текущей странице.

Я внес небольшие изменения в ваш код, надеюсь, это поможет вам.

    let port_element = element.all(by.css('.port-element'));
        expect(port_element.count()).toBe(2);
person Akash Chavan    schedule 11.06.2018
comment
Спасибо, Акаш, таким образом все ок, но проблема в том, что мне нужно понять, как зациклить эти элементы. Посмотрите, например, следующий сценарий таков: я хочу видеть изображение на каждом отдельном элементе порта, поэтому мне нужно зациклить эти элементы и проверить элементы внутри. Как я могу это сделать? Можете ли вы привести пример? - person Spicchio; 11.06.2018