You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate复用函数执行报错:Failed to execute 'querySelector' on 'Document'

Karate复用函数报错:"Failed to execute 'querySelector' on 'Document'" 排查与解决

错误原因

  1. 核心逻辑缺陷:函数中使用driver.exists(expectedLocatorOrValue)判断参数类型时,会将所有传入值当作DOM定位器(如CSS选择器/XPath)处理。当传入普通文本(而非合法定位器)时,浏览器会尝试将文本解析为选择器,触发"不是有效选择器"的错误——普通文本不符合CSS选择器语法规范。
  2. 参数逻辑倒置(潜在问题):函数中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:02:33