Транспортир / огурец: динамически выбирайте первый доступный день в календаре - обещание не выполнено - PullRequest
0 голосов
/ 30 марта 2020

Я хочу создать функцию, которая будет динамически выбирать первый доступный (не отключенный) день в календаре. Но после запуска теста первые два шага в порядке, но после третьего шага я получаю сообщение об ошибке «Ошибка: истекло время ожидания функции, убедитесь, что обещание разрешается в течение 60000 миллисекунд». Я не могу понять, почему обещание не выполнено.

Есть ли другие идеи о том, как выбрать первый доступный день?

When('I select the return date', async () => {
    await calendar.returnDate.click();
    await browser.wait(EC.elementToBeClickable(calendar.searchBtn));

    await calendar.days.each(el => {            //calendar.days are all td in the calendar element.all(by.tagName("td"));
        el.getAttribute("class").then(function (attr) {
          console.log(attr);
            if (attr !== "is-disabled") {      //the disabled days in the calendar are having class="is-disabled"
            el.click();
           }
        })
    })
})

1 Ответ

0 голосов
/ 31 марта 2020

Используйте оператор возврата в определении шага после того, как все ваши шаги будут выполнены.

When('I select the return date', async () => {
  await calendar.returnDate.click();
  await browser.wait(EC.elementToBeClickable(calendar.searchBtn));
  let enabled_day = element.all(by.id('your locator')).filter(e=>e.isDisplayed()).first();
  return enabled_day.click();
})

Если вы хотите проверить свойство isDisplayed массива веб-элементов, используйте метод filter, а затем используйте первый веб-интерфейс. отображаемый элемент.

И не забудьте добавить оператор возврата и оператор ожидания в конце определения шага.

filter(filterFn: (element: ElementFinder, index?: number) => boolean | wdpromise.Promise<boolean>): ElementArrayFinder;
(method) ElementArrayFinder.filter(filterFn: (element: ElementFinder, index?: number) => boolean | promise.Promise<boolean>): ElementArrayFinder

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

@alias — element.all(locator).filter(filterFn)

@view

<ul class="items"> <li class="one">First</li> <li class="two">Second</li> <li class="three">Third</li> </ul>

@example

element.all(by.css('.items li')).filter(function(elem, index) {
  return elem.getText().then(function(text) {
    return text === 'Third';
  });
}).first().click();

// Or using the shortcut $$() notation instead of element.all(by.css()):

$$('.items li').filter(function(elem, index) {
  return elem.getText().then(function(text) {
    return text === 'Third';
  });
}).first().click();

@ param filterFn Функция фильтра, которая будет проверять, должен ли элемент быть возвращен. filterFn может возвращать логическое значение или обещание, которое разрешается в логическое значение

@ возвращает ElementArrayFinder, представляющий массив элементов, которые удовлетворяют функции фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...