Cypress断言时报Cannot read properties of undefined (reading 'toLowerCase')错误如何解决?
问题根因及修复方案
1. 直接报错原因:cy.get()入参使用错误
你当前触发报错的核心问题是测试步骤中cy.get(elements.selection())的用法完全不符合Cypress的语法要求:
elements.selection()方法本身已经返回了cy.get('.__selection')的Cypress链式调用对象,并非CSS选择器字符串cy.get()仅支持传入字符串类型的选择器、元素别名或DOM节点,传入Cypress调用对象会触发内部处理逻辑异常,你看到的Cannot read properties of undefined (reading 'toLowerCase')报错,就是Cypress内部尝试对非字符串的入参执行转小写操作失败导致的。
2. 修复代码
基础修复
直接去掉外层多余的cy.get()即可:
And ("The number of elements is {string}", (number) => { elements.selection().should('be.visible').should('have.length', number); })
优化适配业务场景
针对你验证投注项添加的需求,建议调整断言顺序避免偶发超时:
And ("The number of elements is {string}", (number) => { elements.selection() // 先断言长度符合预期,确认所有投注项已插入DOM,可自定义超时时间覆盖默认4s限制 .should('have.length', number, {timeout: 10000}) // 逐一枚举校验所有投注项可见,避免容器可见但子项未渲染的假阳性情况 .each(el => { cy.wrap(el).should('be.visible'); }) })
调整断言顺序的逻辑:如果先校验可见性,在投注项还在插入DOM的过程中就会直接触发断言失败,先校验长度达标后再校验可见性,完全匹配「选中选项添加到投注单」的业务流程。
3. 异常排查补充
如果修复上述代码后仍有报错,可逐一排查以下两点:
- 确认
.__selection是单条投注项的选择器,若为投注单容器选择器,长度永远为1,无法和投注项数量匹配 - 确认添加投注项操作后没有异步渲染、过渡动画,如果有可在添加操作后增加合理等待,或监听关联接口请求完成后再执行断言
内容的提问来源于stack exchange,提问作者BruceyBandit
相关产品推荐
相关产品推荐

