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()
的默认行为。
选项 | 默认值 | 描述 |
---|---|---|
type | query | 存储的别名类型,影响后续测试中如何检索值。有效值为query 和static 。query 别名每次请求时会重新运行所有查询以获取结果值。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
注意: 所有别名在每个测试前都会被重置。详情参见别名指南。
保留字
别名名称不能匹配某些保留字。
某些字符串不允许作为别名名称,因为它们是Cypress的保留字。这些词包括:test
、runnable
、timeout
、slow
、skip
和inspect
。
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 | 默认情况下,所有别名现在都会重新运行其之前的查询。 |