Spec-Zone.ru › Cypress

и

Создайте утверждение. Утверждения автоматически повторяются до тех пор, пока они не пройдут или не истечёт время ожидания.

Псевдоним .should()

Примечание: .and() предполагает, что вы уже знакомы с основными концепциями, такими как утверждения

Синтаксис

.and(chainers)
.and(chainers, value)
.and(chainers, method, value)
.and(callbackFn)

Использование

Правильное использование

cy.get('.err').should('be.empty').and('be.hidden') // Assert '.err' is empty & hidden
cy.contains('Login').and('be.visible') // Assert el is visible
cy.wrap({ foo: 'bar' })
  .should('have.property', 'foo') // Assert 'foo' property exists
  .and('eq', 'bar') // Assert 'foo' property is 'bar'

Неправильное использование

cy.and('eq', '42') // Should not be chained off 'cy'

Аргументы

chainers (Строка)

Любой допустимый chainers, который поступает из Chai или Chai-jQuery или Sinon-Chai.

value (Строка)

Значение для проверки с помощью chainers.

method (Строка)

Метод, который нужно вызвать для chainers.

callbackFn (Функция)

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

Возвращаемые значения

  • В большинстве случаев .and() возвращает тот же объект, который был передан ему от предыдущей команды.
cy.get('nav') // yields <nav>
  .should('be.visible') // yields <nav>
  .and('have.class', 'open') // yields <nav>

Однако некоторые chainers изменяют объект. В примере ниже, .and() возвращает строку sans-serif, потому что chainers have.css, 'font-family' изменяет объект.

cy.get('nav') // yields <nav>
  .should('be.visible') // yields <nav>
  .and('have.css', 'font-family') // yields 'sans-serif'
  .and('match', /serif/) // yields 'sans-serif'

Примеры

Chainers

Цепочка утверждений над одним и тем же объектом

cy.get('button').should('have.class', 'active').and('not.be.disabled')

Значение

Цепочка утверждений, когда возвращаемые значения изменяются

<!-- App Code -->
<ul>
  <li>
    <a href="users/123/edit">Edit User</a>
  </li>
</ul>
cy.get('a')
  .should('contain', 'Edit User') // yields <a>
  .and('have.attr', 'href') // yields string value of href
  .and('match', /users/) // yields string value of href
  .and('not.include', '#') // yields string value of href

Метод и значение

Утвердить, что href равен '/users'

cy.get('#header a')
  .should('have.class', 'active')
  .and('have.attr', 'href', '/users')

Функция

Проверить длину, содержание и классы из нескольких <p>

Передача функции в .and() позволяет утверждать относительно возвращаемого объекта. Это даёт возможность изменять то, что вы хотите проверить.

Убедитесь, что в вашей функции обратного вызова нет кода, имеющего побочные эффекты.

Функция обратного вызова будет повторяться снова и снова, пока внутри неё не перестанут выбрасываться утверждения.

<div>
  <p class="text-primary">Hello World</p>
  <p class="text-danger">You have an error</p>
  <p class="text-default">Try again later</p>
</div>
cy.get('p')
  .should('not.be.empty')
  .and(($p) => {
    // should have found 3 elements
    expect($p).to.have.length(3)

    // make sure the first contains some text content
    expect($p.first()).to.contain('Hello World')

    // use jquery's map to grab all of their classes
    // jquery's map returns a new jquery object
    const classes = $p.map((i, el) => {
      return Cypress.$(el).attr('class')
    })

    // call classes.get() to make this a plain array
    expect(classes.get()).to.deep.eq([
      'text-primary',
      'text-danger',
      'text-default',
    ])
  })

Использование функции обратного вызова не изменит объект

Примечания

Chai

Сходства с Chai

Если вы работали с Chai раньше, вы увидите, что .and() использует тот же синтаксис флюэнтных утверждений.

Рассмотрим этот явный пример утверждения:

expect({ foo: 'bar' }).to.have.property('foo').and.eq('bar')

.and() воспроизводит это поведение утверждения.

Объекты

Как узнать, какие утверждения изменяют объект, а какие нет?

Chainers, которые поступают из Chai или Chai-jQuery, всегда документируют то, что они возвращают.

Использование функции обратного вызова не изменит возвращаемое значение

Всякий раз, когда вы используете функцию обратного вызова, её возвращаемое значение игнорируется. Cypress всегда заставляет команду возвращать значение с предыдущей команды cy (которое в примере ниже — <button>)

cy.get('button')
  .should('be.active')
  .and(($button) => {
    expect({ foo: 'bar' }).to.deep.eq({ foo: 'bar' })

    return { foo: 'bar' } // return is ignored, .and() yields <button>
  })
  .then(($button) => {
    // do anything we want with <button>
  })

Различия

В чём разница между .then() и .should()/.and()?

Использование .then() позволяет использовать возвращаемый объект в функции обратного вызова и следует использовать, когда вам нужно изменить некоторые значения или выполнить какие-либо действия.

При использовании функции обратного вызова с .should() или .and(), с другой стороны, существует специальная логика повторного выполнения функции обратного вызова, пока внутри неё не перестанут выбрасываться утверждения. Будьте осторожны с побочными эффектами в функции обратного вызова .should() или .and(), которые вы не хотите выполнять несколько раз.

Правила

Требования

  • .and() требует цепочки с предыдущей командой.

Таймауты

  • .and() будет продолжать повторять свои указанные утверждения, пока не истечёт время ожидания.
cy.get('input', {timeout: 10000}).should('have.value', '10').and('have.class', 'error')
                         ↲
  // timeout here will be passed down to the '.and()'
  // and it will retry for up to 10 secs
cy.get('input', {timeout: 10000}).should('have.value', 'US').and(($input) => {
                         ↲
  // timeout here will be passed down to the '.and()'
  // unless an assertion throws earlier,
  // ALL of the assertions will retry for up to 10 secs
  expect($input).to.not.be('disabled')
  expect($input).to.not.have.class('error')
})

Журнал команд

Цепочка утверждений над одним и тем же объектом

cy.get('.list')
  .find('input[type="checkbox"]')
  .should('be.checked')
  .and('not.be.disabled')

Вышеперечисленные команды будут отображаться в Журнале команд как:

Command log for assertions

При нажатии на assert в журнале команд, консоль выведет следующее:

console.log for assertions

См. также

  • .should()
  • Руководство: Введение в Cypress
  • Справочник: Список утверждений

© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/and

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API