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

WebdriverIO结合Jasmine使用时异步函数超时及配置不生效问题排查

根因分析
  • 测试卡点在beforeEach钩子,未进入测试用例:你提到click_app_launcher内的调试日志未输出,说明该函数从未被调用。卡点出在beforeEach钩子中:LightningLeadPage.open()、LightningLeadPage.login()都是WebdriverIO的异步命令,返回Promise对象。而当前beforeEach被定义为同步函数,没有正确等待这些Promise执行完成,导致钩子一直挂起,永远无法进入后续的it测试块。
  • 超时时间仍为10000ms的原因:报错提示的10000ms并非你配置的24小时jasmineNodeOpts.defaultTimeoutInterval,触发原因有二:
    1. jasmineNodeOpts配置未被正确加载:通常是放置位置错误(需放在wdio.conf.js的根配置下,不能嵌套在capabilities、services等其他配置块中),或存在语法错误导致配置被忽略,Jasmine自动使用了默认的10s超时。
    2. WebdriverIO的Jasmine运行器在异步钩子未正确处理Promise时,会触发内置的10s超时兜底。
  • 废弃警告的触发逻辑:日志中“异步钩子同时使用done回调和返回Promise”的警告,是因为WebdriverIO的Jasmine适配层会为同步定义的钩子自动注入done回调,而你的钩子中调用的open()、login()又返回了Promise,二者冲突导致运行逻辑异常。
解决方案

按优先级从高到低执行:

1. 修复异步测试逻辑(核心问题)

WebdriverIO v7及以上版本已废弃同步执行模式,所有WDIO命令都需要显式等待Promise完成,修改代码如下:
测试用例代码:

describe('Lead Routing Functionality', () => {
    // beforeEach 添加 async 关键字
    beforeEach(async function () {
        // 所有WDIO命令前加 await
        await LightningLeadPage.open();
        await LightningLeadPage.login();
        console.log('[TEST STEP INFO]: Checking Header: ');
    });

    // it 块也添加 async 关键字
    it('Verify validation', async () => {
        // 等待页面对象方法执行完成
        await LightningLeadPage.click_app_launcher();
    });
});

页面对象类代码:

export default class Lightning_Page {
  // 方法添加 async 修饰
  async click_app_launcher() {
    console.log("[TEST STEP INFO]: Verify App launcher icon is present. ");
    console.log('DEBUG : I am waiting...')
    // waitForExist 前加 await
    await this.appLauncher().waitForExist(this.waitDuration());
    console.log("[TEST STEP INFO]: Clicking on App Launcher");
    // click 前加 await
    await this.appLauncher().click();
  }
}

2. 验证Jasmine超时配置

确认wdio.conf.js中的jasmineNodeOpts配置在根层级,无嵌套错误,可先配置为30000ms验证是否生效(无需直接设置24小时超时):

// wdio.conf.js 根层级配置示例
exports.config = {
    // 其他原有配置...
    waitforTimeout: 10000,
    connectionRetryTimeout: 90000,
    connectionRetryCount: 3,
    wdioRetries:3,

    jasmineNodeOpts: {
        defaultTimeoutInterval: 30000,
        expectationResultHandler: function(passed, assertion) {
            // do something
        }
    },
}

注意:不需要直接修改全局jasmine.DEFAULT_TIMEOUT_INTERVAL,WDIO的Jasmine适配会自动读取jasmineNodeOpts.defaultTimeoutInterval完成赋值。

3. 排除版本兼容问题

如果你使用的是WebdriverIO v5及更早版本,建议升级到v7+稳定版本,旧版本的同步执行逻辑与Jasmine的适配存在大量已知冲突,容易触发上述异常。

内容的提问来源于stack exchange,提问作者Afsal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 18:06:02