Skip to main content
Cypress应用

as

分配别名供后续使用。稍后可以在cy.get()查询或cy.wait()命令中通过@前缀引用该别名。

info

注意: .as()假设您已经熟悉核心概念如别名

语法

.as(aliasName)
.as(aliasName, options)

用法

正确用法

cy.get('.main-nav').find('li').first().as('firstNav') // 将元素别名为@firstNav
cy.get('input.username').invoke('val').as('username', { type: 'static' }) // 创建别名时引用该值的静态别名
cy.intercept('PUT', '/users').as('putUser') // 将路由别名为@putUser
cy.stub(api, 'onUnauth').as('unauth') // 将存根别名为@unauth
cy.spy(win, 'fetch').as('winFetch') // 将间谍别名为@winFetch

错误用法

cy.as('foo') // 错误,不能直接链式调用'cy'

参数

aliasName (字符串)

别名的名称,稍后可以在cy.get()cy.wait()命令中使用@前缀引用。

options (对象)

传入选项对象以更改.as()的默认行为。

选项默认值描述
typequery存储的别名类型,影响后续测试中如何检索值。有效值为querystaticquery别名每次请求时会重新运行所有查询以获取结果值。static别名在存储时获取一次,之后不会改变。type在别名拦截、间谍和存根时无效。

生成结果 了解主题管理

  • .as()返回与输入相同的主题。
  • .as()之后继续链式调用是安全的。

示例

DOM元素

为DOM元素创建别名,然后使用cy.get()访问该别名元素。

it('点击后禁用', () => {
cy.get('button[type=submit]').as('submitBtn')
cy.get('@submitBtn').click().should('be.disabled')
})

拦截

为使用cy.intercept()定义的拦截路由创建别名,然后使用cy.wait()等待该别名路由。

// 对`/users`端点的`PUT`请求将被`user`夹具存根并别名为`editUser`
cy.intercept('PUT', '/users', { fixture: 'user' }).as('editUser')

// 假设提交`form`会触发匹配的请求
cy.get('form').submit()

// 一旦从`editUser`返回响应
// 这个`wait`将解析为包含`url`的主题
cy.wait('@editUser').its('url').should('contain', 'users')

更多别名路由的示例可以在这里找到。

夹具

cy.fixture()数据创建别名,然后通过this访问该别名。

beforeEach(() => {
cy.fixture('users-admins.json').as('admins')
})

it('用户夹具绑定到this.admins', function () {
cy.log(`共有${this.admins.length}个管理员。`)
})
caution

注意使用标准函数语法。使用箭头函数通过this访问别名将不起作用,因为词法绑定this

注意事项

别名会被重置

caution

注意: 所有别名在每个测试前都会被重置。详情参见别名指南

保留字

别名名称不能匹配某些保留字。

某些字符串不允许作为别名名称,因为它们是Cypress的保留字。这些词包括:testrunnabletimeoutslowskipinspect

as是异步的

记住Cypress命令是异步的,包括.as()

因此,您不能同步访问任何已别名的内容。必须使用其他异步命令如.then()来访问您创建的别名。

以下是更多使用.as()的示例,展示了异步行为。

describe('一个夹具', () => {
describe('别名可以被访问', () => {
it('通过get().', () => {
cy.fixture('admin-users.json').as('admins')
cy.get('@admins').then((users) => {
cy.log(`共有${users.length}个管理员。`)
})
})

it('通过then().', function () {
cy.fixture('admin-users.json').as('admins')
cy.visit('/').then(() => {
cy.log(`共有${this.admins.length}个管理员。`)
})
})
})

describe('在beforeEach()中别名', () => {
beforeEach(() => {
cy.fixture('admin-users.json').as('admins')
})

it('绑定到this.', function () {
cy.log(`共有${this.admins.length}个管理员。`)
})
})
})

规则

要求 了解命令链

  • .as()需要链式调用在先前的命令上。

断言 了解断言

  • .as()是一个实用命令。
  • .as()不会运行断言。断言会像该命令不存在一样通过。

超时设置 了解超时机制

  • .as()不会超时。

命令日志

为多个路由创建别名

cy.intercept('/company/*').as('companyGet')
cy.intercept('/roles/*').as('rolesGet')
cy.intercept('/teams/*').as('teamsGet')
cy.intercept(/users\/\d+/).as('userGet')
cy.intercept('PUT', /^\/users\/\d+/).as('userPut')

路由的别名显示在路由仪表板中:

命令日志中的路由

历史

版本变更
12.3.0添加type选项以选择12.0.0之前的行为。
12.0.0默认情况下,所有别名现在都会重新运行其之前的查询。

另请参阅