Cypress测试中如何获取select下拉框选中值用于路由断言?
报错原因
你的代码存在三个核心问题,直接导致报错和断言失效:
.then()方法要求传入函数类型的参数,你写的.then((selectedIssueID = $lastOption.text()))是赋值语句,执行后返回的是字符串,Cypress会尝试把这个字符串当作回调函数调用,直接触发Cannot read properties of undefined (reading 'apply')错误。- Cypress的所有命令都是异步排队执行的,你在命令队列外部声明
selectedIssueID变量,当代码运行到URL断言行时,前面的选下拉、取值逻辑还没实际执行,变量还是初始的空字符串,断言必然失败。 - 选择下拉选项时,优先读取option的
value属性比读取显示文本更稳定,和表单原生取值逻辑一致。
修复后的测试代码
it.only('Issue Analysis dropdown functionality check', () => { // 断言下拉框存在有效可选项(排除默认disabled的占位选项) cy.get('[data-cy=issue-analysis-select-issue-dropdown] option') .should('have.length.gt', 1) .last() .invoke('val') // 直接读取最后一个option的value属性 .then((selectedIssueID) => { // 选中对应选项 cy.get('[data-cy=issue-analysis-select-issue-dropdown]').select(selectedIssueID) // 断言路由跳转正确,所有依赖selectedIssueID的逻辑都要放在then回调内部 cy.url().should('include', `/analysis/${selectedIssueID}`) }) })
补充说明
如果你的业务逻辑确实是用option显示文本而非value做路由匹配,把.invoke('val')替换成.invoke('text')即可。注意所有需要用到选中值的逻辑,都必须写在拿到值的.then()回调内部,不要在Cypress命令流外部用普通let/var变量存值跨步骤传递,一定会碰到异步时序问题。
内容的提问来源于stack exchange,提问作者LovelyAndy
相关产品推荐
相关产品推荐

