Cypress数组断言失败问题求助:比较数组时提示对象类型不匹配
Cypress数组断言失败问题求助:比较数组时提示对象类型不匹配
嘿,刚接触Cypress遇到这种问题太正常啦,我来帮你捋捋问题出在哪,以及怎么解决~
首先看你这段代码的核心问题:你误解了cy.get()的用法,它是用来查询DOM元素的,参数得是CSS选择器或者jQuery对象,不能直接传数组哦!你之前写的cy.get(desiredCEXs)和cy.get(expectedCEXnames)都是错误用法,这就导致你拿到的根本不是数组,而是Cypress的元素集合对象,自然会提示类型不匹配。
你的需求应该是:先定义好期望的交易所数组,再从页面上提取实际显示的交易所名称组成数组,最后断言两者的成员一致对吧?那正确的写法应该是这样的:
Then('I assert what exchanges KIRA Network is listed on', () => { // 预定义你期望的交易所数组(注意这里你写了两个Gate.io,确认页面确实显示两次哦) const desiredCEXs = ['Gate.io', 'AscendEX (BitMax)', 'Uniswap V2 (Ethereum)', 'Gate.io']; // 定位到页面上的交易所行,提取文本组成实际数组 cy.get('tbody').eq(4).find('tr') .then($rows => { // 把jQuery对象转成原生数组,再提取每行的文本并去除空格 const actualCEXnames = Array.from($rows).map(row => row.textContent.trim()); // 断言实际数组包含所有期望的成员(顺序不影响) expect(actualCEXnames).to.have.all.members(desiredCEXs); // 如果要求顺序完全一致,就换成下面这句 // expect(actualCEXnames).to.deep.equal(desiredCEXs); }); });
我再给你拆解下关键步骤:
- 用
cy.get('tbody').eq(4).find('tr')定位到所有交易所行,得到的是Cypress的元素集合(jQuery对象) - 通过
Array.from($rows)把它转成原生JavaScript数组,这样就能用map方法提取每个元素的文本内容了 - 最后用Chai断言库的
have.all.members来判断两个数组的成员是否完全匹配(不关心顺序),如果需要严格顺序一致就用deep.equal
另外提醒下,你之前定义的expectedCEXnames数组没有被正确填充,而且也不需要用cy.get()去调用它,直接在断言里使用数组本身就行啦。
备注:内容来源于stack exchange,提问作者test automation learner
相关产品推荐
相关产品推荐

