Protractor登录测试报script timeout及Jasmine超时原因排查
登录场景Protractor测试超时的根因排查与修复方案
核心异常诱因
- 异步操作链未正确顺序执行:即使测试函数声明了async,原代码中
navigateTo、sendKeys、click这类返回Promise的Protractor操作没有添加await标记,在关闭Selenium Promise管理器的新版Protractor配置下,操作不会自动排队串行执行,极有可能出现断言查询早于点击动作触发的情况,导致WebDriver长期轮询未变更的页面状态,最终触发脚本超时。 - block-ui遮罩的阻塞影响:block-ui的常规逻辑是在登录请求期间弹出全屏交互遮罩,若存在接口响应慢、前端回调未正确销毁遮罩实例的问题,WebDriver在执行后续元素定位、URL获取操作时,会因为元素被不可点击的遮罩遮挡,持续等待可交互状态直到超时。这类阻塞不会在其他正常释放遮罩的block-ui项目中复现。
- 跳转状态的等待缺失:账号密码正确的登录用例中,点击登录按钮后没有等待路由跳转完成的逻辑,直接读取当前URL的操作会在页面跳转的加载阶段持续轮询,直到超时;当把
allScriptsTimeout调大后,测试框架jasmine会先触发自身的异步回调超时规则,抛出“Async callback was not invoked within timeout”的错误。
落地排查与修复步骤
- 补全所有Protractor操作的await标记,添加显式等待逻辑替代隐式硬等,修正后的测试代码参考:
it('Wrong id pass input causes error', async () => { page = new AppPage(); await page.navigateTo(); await $('#exampleInput1').sendKeys('aaa') await $('#exampleInput2').sendKeys('bbb') await $('button').click(); // 兜底等待block-ui遮罩完全消失 await browser.wait( protractor.ExpectedConditions.invisibilityOf($('.block-ui')), 10000, 'block-ui遮罩超过10秒未释放' ); const isToastWarningPresent = await $('div#toast-container>.toast-warning').isDisplayed() expect(isToastWarningPresent).toBeTrue() }) it('Right id pass input redirect you to mainpage', async () => { page = new AppPage(); await page.navigateTo(); await $('#exampleInput1').sendKeys(username) await $('#exampleInput2').sendKeys(password) await $('button').click(); // 显式等待URL匹配预期,替代直接硬断言 await browser.wait( protractor.ExpectedConditions.urlContains(expectedUrl), 10000, '登录成功后未在10秒内跳转至主页面' ); expect(await browser.getCurrentUrl()).toEqual(expectedUrl) })
- 手动在浏览器开发者工具中复现登录流程:观察登录接口返回后,
.block-ui对应的DOM节点是否被正确移除,排查是否存在残留的异步回调、定时器导致遮罩一直驻留页面;前端业务逻辑的遮罩销毁缺陷需要优先修复,测试层的等待逻辑仅做兜底。 - 核对定位器匹配范围:当前代码中
$('button')会选中页面上第一个button元素,需确认该元素确实是触发登录的按钮,避免误点击页面其他无效按钮导致流程卡在登录页触发超时。 - 调整超时配置的合理层级:不要直接将
allScriptsTimeout调整到110秒的超长值,可先将jasmine.DEFAULT_TIMEOUT_INTERVAL设置为15000,将allScriptsTimeout设置为16000,通过报错层级区分是WebDriver执行超时,还是框架层异步等待超时。
内容的提问来源于stack exchange,提问作者Mete Korucu
相关产品推荐
相关产品推荐

