Как дождаться завершения вызова API, а затем проверить наличие элемента с помощью кипариса?

я новичок в кипарисе, и я пытаюсь проверить, существует ли элемент на странице после завершения вызова API.

я делаю http-сообщение для URL-адреса «вещи/вещь1», и как только этот API завершится, я хочу проверить, присутствует ли элемент span на странице.

Я пробовал что-то вроде ниже.

const setUp = () => {
    cy.apiPatchSomethings(something1)
        .then(() => {
            cy.reload();
        });
}

describe('Suite name', () => {
    before(() => {
        setUp();
    });
    it('test case', () => {
        cy.contains('span');
    }
});

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

если я использую cy.wait(10000), как показано ниже, это работает

it('test case', () => {
    cy.wait(10000);
    cy.contains('span');
});

но я не хочу использовать cy.wait. есть ли другой способ решить это. может кто-нибудь помочь мне с этим. Спасибо.


person stackuser    schedule 07.01.2021    source источник
comment
cy.apiPatchSomethings возвращает обещание?   -  person Jonah    schedule 08.01.2021


Ответы (2)


Команда Cypress cy.contains() при вызове с одним аргументом поиск контента,

Синтаксис
cy.contains(content)
cy.contains(content, options)
cy.contains(selector, content)
cy.contains( селектор, содержимое, параметры)

но я предполагаю, что вы ищете элемент span, поэтому используйте

cy.get('span')

or

cy.contains('span', 'my-content-in-span')

Предположим, проблема не в этом, а просто в произвольном примере кода...

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

const setUp = () => {
  return cy.apiPatchSomethings(something1)     // need a return here
    .then(() => {
      return new Cypress.Promise(resolve => {  // inner return also
        cy.reload()
        resolve(true)                          // resolve will signal reload is finished
      })
    });
}

Поскольку setup() вызывается внутри before(), Cypress будет ждать разрешения промиса, прежде чем продолжить.

Пожалуйста, не добавляйте дополнительные ожидания или тайм-ауты, которые слишком часто предлагаются. Это приведет только к ненадежным тестам.

Примечание, если вы не против отказаться от функции setup(), она станет намного проще.

describe('Suite name', () => {

  before(() => {
    cy.apiPatchSomethings(something1)
      .then(() => cy.reload() );      // all commands here will be completed
                                      // before the tests start
  });

  it('test case', () => {
    cy.contains('span', 'my-content-in-span');
  }
});
person Community    schedule 08.01.2021

1. Вы можете подождать, пока span станет видимым. Тайм-аут по умолчанию, который предоставляет Cypress, составляет 4 секунды.

cy.contains('span').should('be.visible')

2. Если вы хотите указать пользовательский тайм-аут (например, 10 секунд), специфичный для этой команды, вы можете использовать:

cy.contains('span', { timeout: 10000 }).should('be.visible')

3. Если вы хотите увеличить тайм-аут глобально, вы указываете это в своем файле cypress.json:

"defaultCommandTimeout": 10000

а затем просто используйте:

cy.contains('span').should('be.visible')

Теперь все ваши команды будут иметь таймаут по умолчанию 10 секунд.

person Alapan Das    schedule 08.01.2021