Karate复用函数执行报错:Failed to execute 'querySelector' on 'Document'
Karate复用函数报错:"Failed to execute 'querySelector' on 'Document'" 排查与解决
错误原因
- 核心逻辑缺陷:函数中使用
driver.exists(expectedLocatorOrValue)判断参数类型时,会将所有传入值当作DOM定位器(如CSS选择器/XPath)处理。当传入普通文本(而非合法定位器)时,浏览器会尝试将文本解析为选择器,触发"不是有效选择器"的错误——普通文本不符合CSS选择器语法规范。 - 参数逻辑倒置(潜在问题):函数中
res = expectedText.includes(actualValue)的逻辑是判断预期文本是否包含实际文本,这与"验证实际内容包含指定内容"的需求完全相反,会导致后续验证结果错误。
解决办法
需要先安全区分传入参数是定位器还是普通文本,同时修正参数逻辑倒置问题,以下是两种可行方案:
方案1:捕获driver.exists执行错误,自动区分类型
修改函数,当调用driver.exists抛出选择器无效错误时,直接判定参数为文本值,同时修正包含逻辑:
* def I_Verify_Text_Contains_ = """function(expectedLocatorOrValue, actualValue) { var expectedText; try { // 尝试作为定位器查找元素 if(driver.exists(expectedLocatorOrValue)){ retry().waitFor(expectedLocatorOrValue) expectedText = driver.text(expectedLocatorOrValue).replace(/\s\s+/g, ' '); } else { expectedText = expectedLocatorOrValue; } } catch(e) { // 捕获选择器无效错误,判定为文本值 if(e.message.includes('Failed to execute \'querySelector\'') || e.message.includes('invalid selector')){ expectedText = expectedLocatorOrValue; } else { karate.fail('ERROR: ' + e.message); } } // 修正逻辑:验证实际值是否包含预期文本(符合需求) res = actualValue.includes(expectedText); try { if(res) { karate.log('PN-FUNCTIONS: Actual text contains ' + expectedText) } else { karate.fail('PN-FUNCTION-ERROR: Actual text does not contain ' + expectedText) } } catch(e) { if(e.message.includes('Cannot read property')) { karate.fail('ERROR :The element [locator :'+ expectedLocatorOrValue + '] cannot be found') } else if(e.message.includes('ReferenceError')) { karate.fail('ERROR : '+actualValue+' is not defined') } else{ karate.fail(e.message) } } }"""
方案2:新增类型标识参数,明确参数类型
通过第三个参数明确指定第一个参数是locator还是text,避免自动判断的风险:
* def I_Verify_Text_Contains_ = """function(type, target, actualValue) { var expectedText; if(type === 'locator'){ retry().waitFor(target) expectedText = driver.text(target).replace(/\s\s+/g, ' '); } else if(type === 'text'){ expectedText = target; } else { karate.fail('ERROR: Invalid type, must be "locator" or "text"'); } res = actualValue.includes(expectedText); if(res) { karate.log('PN-FUNCTIONS: Actual text contains ' + expectedText) } else { karate.fail('PN-FUNCTION-ERROR: Actual text does not contain ' + expectedText) } }"""
调用方式:
- 传入定位器:
Then I_Verify_Text_Contains_('locator', MyLocatorDefinedInJsonFile, "Actual text to compare") - 传入文本值:
Then I_Verify_Text_Contains_('text', "Expected Value as Text", "Actual text to compare")
内容的提问来源于stack exchange,提问作者dkc
相关产品推荐
相关产品推荐

