Protractor中expectationFailOutput失效,仅显示元素未找到报错
问题原因分析
嘿,我来帮你捋捋这个问题——你遇到的情况其实不是expectationFailOutput失效了,而是代码执行顺序的问题导致自定义报错根本没机会触发。
你写的代码里,await login.mainError.getText()是在expect断言逻辑之前就执行的:
await expect(await login.mainError.getText()).toBe('We do not recognize that email.', `Actual login error message: ${blabla }does not match expected: 'TEST CORRECT'`)
如果这一步里的元素login.mainError找不到,代码会直接抛出「元素未找到」的错误,根本走不到expect的断言判断环节,自然也就不会触发你设置的自定义失败输出。
而你依赖的这个自定义报错参数(或者说expectationFailOutput的逻辑),只有在断言本身失败的时候才会生效——也就是元素成功找到,但文本内容和预期不匹配的场景。
解决方案
针对这个问题,你可以从以下几个方向调整代码:
先确保元素可用再执行断言
用Protractor自带的ExpectedConditions等待元素可见,既可以避免元素未加载完成导致的误判,也能自定义等待超时的错误提示:const EC = protractor.ExpectedConditions; // 等待错误提示元素可见,超时5秒则抛出自定义错误 await browser.wait(EC.visibilityOf(login.mainError), 5000, 'Login error message element did not appear in time'); const actualErrorText = await login.mainError.getText(); await expect(actualErrorText).toBe( 'We do not recognize that email.', `Actual login error message: ${actualErrorText} does not match expected: 'TEST CORRECT'` );捕获元素查找错误并自定义输出
如果需要在元素找不到时也显示自定义信息,可以用try-catch包裹元素查找逻辑:let actualErrorText; try { actualErrorText = await login.mainError.getText(); } catch (err) { throw new Error(`Custom Error: Failed to locate login error element. Original message: ${err.message}`); } await expect(actualErrorText).toBe( 'We do not recognize that email.', `Actual login error message: ${actualErrorText} does not match expected: 'TEST CORRECT'` );明确断言参数的适用场景
记住:toBe的第二个自定义错误参数,只有在「元素存在但文本不符」的断言失败场景才会触发。如果是元素查找、文本获取这类前置步骤出错,和断言逻辑无关,自然不会调用这个参数。
内容的提问来源于stack exchange,提问作者Alexander Tunick
相关产品推荐
相关产品推荐

