its

Get a property's value on the previously yielded subject.

Syntax

.its(propertyName)
.its(propertyName, options)

Usage

Correct Usage

cy.wrap({ width: '50' }).its('width') // Get the 'width' property
cy.window().its('sessionStorage') // Get the 'sessionStorage' property

Incorrect Usage

cy.its('window') // Errors, cannot be chained off 'cy'
cy.clearCookies().its('length') // Errors, 'clearCookies' does not yield Object

Arguments

propertyName (String, Number)

Index, name of property or name of nested properties (with dot notation) to get.

options (Object)

Pass in an options object to change the default behavior of .its().

OptionDefaultDescription
logtrueDisplays the command in the Command log
timeoutdefaultCommandTimeoutTime to wait for .its() to resolve before timing out

Yields

  • .its() 'yields the value of the property'

Examples

Objects

Get property

cy.wrap({ age: 52 }).its('age').should('eq', 52) // true

Arrays

Get index

cy.wrap(['Wai Yan', 'Yu']).its(1).should('eq', 'Yu') // true

DOM Elements

Get the length property of a DOM element

cy.get('ul li') // this yields us a jquery object
  .its('length') // calls 'length' property returning that value
  .should('be.gt', 2) // ensure the length is greater than 2

Requests

Get the user object of the response's body

cy
  .request(...)
  .its('body.user')
  .then(user => ...)

alternatively, use destructuring

cy
  .request(...)
  .its('body')
  .then(({user}) => ...)

Strings

Get length of title

cy.title().its('length').should('eq', 24)

Functions

Get function as property

const fn = () => {
  return 42
}

cy.wrap({ getNum: fn }).its('getNum').should('be.a', 'function')

Access function properties

You can access functions to then drill into their own properties instead of invoking them.

// Your app code
// a basic Factory constructor
const Factory = (arg) => {
  // ...
}

Factory.create = (arg) => {
  return new Factory(arg)
}

// assign it to the window
window.Factory = Factory
cy.window() // yields window object
  .its('Factory') // yields Factory function
  .invoke('create', 'arg') // now invoke properties on it

Use .its() to test window.fetch

Nested Properties

You can drill into nested properties by using dot notation.

const user = {
  contacts: {
    work: {
      name: 'Kamil',
    },
  },
}

cy.wrap(user).its('contacts.work.name').should('eq', 'Kamil') // true

Existence

Wait for some property to exist on window

cy.window()
  .its('globalProp')
  .then((globalProp) => {
    // do something now that window.globalProp exists
  })

Assert that a property does not exist on window

cy.window().its('evilProp').should('not.exist')

Rules

Requirements

  • .its() requires being chained off a previous command.

Assertions

  • .its() will automatically retry until it has a property that is not null or undefined .

Timeouts

  • .its() can time out waiting for the property to exist.
  • .its() can time out waiting for assertions you've added to pass.

Command Log

Get responseBody of aliased route

cy.intercept('/comments', { fixture: 'comments.json' }).as('getComments')
cy.get('#fetch-comments').click()
cy.wait('@getComments')
  .its('response.body')
  .should(
    'deep.eq',
    JSON.stringify([
      { id: 1, comment: 'hi' },
      { id: 2, comment: 'there' },
    ])
  )

The commands above will display in the Command Log as:

Command Log for its

When clicking on its within the command log, the console outputs the following:

Console Log for its

History

VersionChanges
3.8.0Added support for options argument
3.7.0Added support for arguments of type Number for propertyName

See also