Как сделать пользовательскую дочернюю команду автоматически повторной - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь использовать следующую двойную команду в качестве ярлыка для поиска элементов dom.

Cypress.Commands.add "el", prevSubject: "optional", (subject, id) =>
  if subject?
    subject.find("[data-cy=#{id}]")
  else
    cy.get("[data-cy=#{id}]")

Проблема в том, что команда не повторяет попытку, если элемент, который я ищу, нуждается в мгновении

Все следующие подходы работают

cy.wait(1000)                           # wait for element to appear
cy.get("parent").el("mark")

cy.get("parent").find("[data-cy=mark]") # or type out what the command does

cy.el("mark")                           # or use the command as parent command

, но просто cy.get("parent").el("mark") не ждет появления элемента и дает сбой.

Я получаю то же самоепроблема, если я определяю команду как дочернюю команду следующим образом

Cypress.Commands.add "el", prevSubject: true, (subject, id) =>
    subject.find("[data-cy=#{id}]")

Есть ли способ заставить мою пользовательскую команду вести себя так же, как find?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Сделайте это вместо

coffeescript:

cy.wrap(subject).find("[data-cy=#{id}]")

javascript:

cy.wrap(subject).find(`[data-cy=${id}]`)
0 голосов
/ 07 февраля 2019

Это довольно удивительно, но я смог проверить ваши результаты.

Самая простая работа, которую я придумал (немного хак), состоит в том, чтобы заново получить предмет в пользовательской команде.

Cypress.Commands.add('el_with_ReGet', {prevSubject: true}, (subject, id) => {
  const selector = subject.selector || subject.prevObject.selector;
  return cy.get(selector).find(`[data-cy=${id}]`)
})

Другой вариант - использовать стороннюю Cypress Pipe вместо пользовательской команды.

cy.pipe можно использовать какболее простая замена Cypress Custom Commands - вы просто пишете функции.

cy.pipe работает очень похоже на cy.then, за исключением нескольких ключевых отличий:

  • pipe будет пытаться документироватьимя функции в журнале команд (работает только с именованными функциями)
  • pipe создаст моментальные снимки DOM для помощи в отладке. Если функция, переданная в pipe, разрешается синхронно (не содержит команд Cypress)
    • И возвращает элемент jQuery, pipe будет повторяться до тех пор, пока список элементов jQuery не станет пустым (большинство команд Cypress делают это)
    • Исопровождается cy.should,функция будет повторяться до тех пор, пока утверждение не пройдет или не истечет время ожидания (большинство команд Cypress делают это)

import 'cypress-pipe';

it('should find child by id by pipe (replacing custom command)', () => {

  const elFn = (id) => (subject) => subject.find(`[data-cy=${id}]`)

  cy.visit(...)

  cy.get('parent')
    .pipe(elFn('mark'))
    .then(result => {
      console.log('find result', result)
      expect(result.length).to.eq(1)
    })

})

Здесь есть обсуждение Cypress.Commands.add нужна опция для принудительного повтора этой команды # 2670 на примере Глеба Бахмутова с использованием cy.verifyUpcomingAssertions(), но этовыглядит довольно сложно.

Этот шаблон работал нормально, когда тест (в конце концов) прошел успешно, но я не смог заставить его прекратить повторные попытки, когда тест не удался (должен пройти тайм-аут, но я не могу понять, как),

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