如何在Cypress中不使用类选择器判断返回的HTML元素类型?
解决Cypress判断元素是p-inputmask还是input的问题
你可以直接通过原生DOM元素的tagName属性来判断元素类型,这是最直接可靠的方式,同时要注意Cypress的异步特性,把后续逻辑放到.then()块内执行,避免因异步导致的变量值不更新问题。
修正后的代码如下:
Cypress.Commands.add('textInputWithLabelTest', (inputId,isDisabled,expectedLabel) => { cy.get(`[for="${inputId}"]`).should('contain',expectedLabel); cy.get(`#${inputId}`).then( ($el) => { // 获取原生DOM元素的标签名(大写) const tagName = $el[0].tagName; const isMask = tagName === 'P-INPUTMASK'; if(isMask) { cy.get(`#${inputId}`).siblings('input').should(isDisabled ? 'be.disabled' : 'not.be.disabled'); } else { cy.get(`#${inputId}`).should(isDisabled ? 'be.disabled' : 'not.be.disabled'); } }) })
关键说明:
- 判断元素类型:
$el[0]是获取jQuery对象对应的原生DOM元素,它的tagName属性会返回大写的标签名称(比如你截图中显示的INPUT和P-INPUTMASK),直接对比即可准确判断元素类型。 - 异步逻辑处理:之前的代码中
mask变量的修改和后续的if判断是分开的,由于Cypress的异步执行特性,if会在.then()块之前运行,导致mask始终是初始的false。把判断和后续逻辑都放到.then()内部,就能保证拿到正确的元素类型后再执行对应断言。
为什么之前的方法无效:
- 你用
$el.find('p-inputmask')是在查找当前元素的子元素,但实际目标元素本身就是p-inputmask或input,所以这个方法找不到正确的元素。 JSON.stringify()和toString()无法处理DOM对象的循环引用,自然也无法用来判断元素类型,而tagName是原生DOM的基础属性,不存在这个问题。
内容的提问来源于stack exchange,提问作者Hex
相关产品推荐
相关产品推荐

