如何在Cypress中根据用户存在状态实现创建/更新用户的条件测试?
解决Cypress中条件判断创建/更新用户的问题
要实现根据用户是否存在来执行创建或更新操作,核心是处理Cypress的异步特性——不能用普通的if-else直接包裹Cypress命令,必须在异步回调中完成条件判断。
问题根源
你之前的尝试错误在于:
- 直接用
if (cy.get(...))判断,cy.get()返回的是Cypress链式对象,永远为true,无法正确判断元素是否存在 - 使用
$element.has(selector)时,没有通过.length检查是否真的找到匹配元素,has()返回的是jQuery对象,不能直接作为布尔值使用
正确实现方式
下面两种方案都能实现需求,选适合你页面结构的即可:
方案1:通过编辑按钮是否存在判断
UserHelpers.filterUser("mama"); // 查找目标用户的编辑按钮,通过元素长度判断是否存在 cy.get(`[id^='Edit_${webAdminUser.userName}']`).then(($editBtn) => { if ($editBtn.length > 0) { // 用户存在,执行更新流程 $editBtn.first().click(); UserHelpers.updateUser(webAdminUser); } else { // 用户不存在,执行创建流程 UserHelpers.createUser(webAdminUser); } }).catch(() => { // 捕获查找编辑按钮失败的情况(元素不存在),直接执行创建 UserHelpers.createUser(webAdminUser); });
方案2:通过无数据提示判断
如果页面在无用户时会显示No data found提示,可以用这个方法:
UserHelpers.filterUser("mama"); cy.get(".rt-tbody").then(($tbody) => { const hasNoData = $tbody.find(".rt-noData").length > 0; if (hasNoData) { // 无数据,创建用户 UserHelpers.createUser(webAdminUser); } else { // 有数据,找到编辑按钮并更新 cy.get(`[id^='Edit_${webAdminUser.userName}']`).first().click(); UserHelpers.updateUser(webAdminUser); } });
关键注意点
- 所有条件判断必须放在
.then()回调中,只有这里才能拿到实际的DOM元素(同步获取) - 用jQuery的
.length属性判断元素是否存在,length > 0表示找到元素,反之则不存在 - 可以用
.catch()处理元素查找失败的场景,避免测试因元素不存在而报错
内容的提问来源于stack exchange,提问作者Mamunur Rashid
相关产品推荐
相关产品推荐

