Пользовательская команда кипариса, которая возвращается, когда вершина готова

1

Я пытаюсь заставить кипарис работать на Oracle Apex. Тем не менее, кажется, что страница не полностью загружена при возврате из моей пользовательской команды.

Я хочу сделать return w.apex; только когда вызвано событие apex "apexreadyend" (это последнее событие в загрузке страницы для oracle apex).

Как я могу это сделать? Или, может быть, это можно вызвать после каждой загрузки страницы?

Мне удалось сделать эту команду:

Cypress.Commands.add("apex", () => {

    cy.window().then((w) => {
        return w.apex;
    });
});

Обновить:
Я думаю, что событие "apexreadyend" уже произошло в этот момент, что делает его бесполезным. Вместо этого я пошел для проверки на теле:

cy.get('body').should('not.have.class','no-anim')

Однако пользовательская тема может не использовать этот класс. Так что это не очень хорошее решение.

Теги:
javascript-events
cypress
dom-events
oracle-apex

2 ответа

0
Лучший ответ

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

Cypress.Commands.add("apex", () => {
  const EVENT_NAME = "apexreadyend"
  return cy.window() // get a handle for the window
  .then($win => {
    return new Cypress.Promise(resolve => {
      const onReady = () => {
        $win.removeEventListener(EVENT_NAME, onReady) // cleanup
        resolve() // resolve and allow Cypress to continue
      }
      $win.addEventListener(EVENT_NAME, onReady)
    })
  })
})

Тогда такие вещи будут работать:

cy.apex() // wait for 'apexreadyend' to fire
// do some assertions here that will only pass after apexreadyend
  • 0
    Это кажется хорошим, однако я получаю сообщение об ошибке: CypressError: cy.then () истекло время ожидания после ожидания «4000 мс». Ваша функция обратного вызова возвратила обещание, которое никогда не разрешалось. Функция обратного вызова: и разрешить Cypress продолжить}; $ win.addEventListener (EVENT_NAME, onReady);}); }
  • 0
    Вы можете увеличить время ожидания на then , если он слишком короткий. Примерно так: .then({ timeout: 30000 }, $win => { установит тайм-аут на 30 секунд
Показать ещё 1 комментарий
0

Вы хотите подождать, пока window.apex существует? Благодаря логике Cypress Retry вам на самом деле не нужно прослушивать событие для этой функции. Вы можете просто использовать cy.its() чтобы получить значение свойства, как только оно определено:

Cypress.Commands.add("apex", () => {
  return cy.window()
  .its('apex') // will automatically retry until 'window.apex' exists
               // or until the default timeout occurs
})

Тогда вы сможете использовать его так:

it('something apex', function() {
  cy.apex().then(apex => {
    // do whatever you want with the apex object
  })
  // or, since it wrapped, can also just do assertions like this:
  cy.apex().its('some-property').should('equal', 'abc123')
})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню