Пользовательская команда кипариса, которая возвращается, когда вершина готова - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь заставить кипарис работать на 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')

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

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Вы можете заключить ваше мероприятие в Обещание.В документации 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 голосов
/ 08 апреля 2019

Вы хотите подождать, пока не появится window.apex?Благодаря логике повторов Cypress, вам на самом деле не нужно слушать событие для этой функции.Вы можете просто использовать 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's wrapped, can also just do assertions like this:
  cy.apex().its('some-property').should('equal', 'abc123')
})
...