JEST:“异步回调未在jest.setTimeout指定的5000ms超时内调用”。

sga*_*dev 7 javascript selenium-webdriver webdriver-io jestjs

在您指出之前,是的,我知道这似乎是多个问题的重复。

但是,我实现了建议的所有3个修复程序;

  • jest.setTimeout()在测试中使用以设置异步超时
  • 使用第三个参数test()传递扩展的异步超时限制
  • done完成后调用函数

但是,在自动Linux机器(Jenkins)上运行我的笑话测试时,它仍然会抛出相同的错误。另外,值得一提的是,这在运行NodeJS v10的MacOS计算机上运行良好,而自动化的Linux计算机运行NodeJS V8.8.3(最新的LTS版本)

这就是我开玩笑的测试结果。

const webdriverio = require('webdriverio');
const options = {
    desiredCapabilities: {
        browserName: 'chrome',
        chromeOptions: {
            args: ["--no-sandbox", "disable-web-security", "--disable-dev-shm-usage"]
        } 
    } 
};
const client = webdriverio.remote(options);

beforeEach(async () => {
    await client.init();
})

test('Google Search for WebdriverIO has correct title', async (done) => {
    jest.setTimeout(30000)
    await client.url('https://www.google.com/ncr');
    await client.setValue('input[name=q]', 'WebdriverIO');
    await client.click('input[value="Google Search"]');
    const title = await client.getTitle();
    expect(title).toBe('WebdriverIO - Google Search');
    done();
}, 30000);

afterEach(async () => {
    await client.end();
});
Run Code Online (Sandbox Code Playgroud)

这是我尝试运行测试时得到的日志;

09:57:19 > jest --config jest.config.js
09:57:19 
09:57:20 Installing selenium server ...
09:57:22 Starting selenium server ...
09:57:23 Selenium server started ...
09:57:29 FAIL jest/test/google.spec.js (5.874s)
09:57:29   ??? Google Search for WebdriverIO has correct title (5016ms)
09:57:29 
09:57:29   ??? Google Search for WebdriverIO has correct title
09:57:29 
09:57:29     Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
09:57:29 
09:57:29       at mapper (node_modules/jest-jasmine2/build/queue_runner.js:41:52)
09:57:29 
09:57:29   ??? Google Search for WebdriverIO has correct title
09:57:29 
09:57:29     A session id is required for this command but wasn't found in the response payload
09:57:29 
09:57:29       at new RuntimeError (node_modules/webdriverio/build/lib/utils/ErrorHandler.js:143:12)
09:57:29       at RequestHandler.createOptions (node_modules/webdriverio/build/lib/utils/RequestHandler.js:121:23)
09:57:29       at RequestHandler.create (node_modules/webdriverio/build/lib/utils/RequestHandler.js:212:43)
09:57:29       at Object.url (node_modules/webdriverio/build/lib/protocol/url.js:24:32)
09:57:29       at Object.exec (node_modules/webdriverio/build/lib/helpers/safeExecute.js:28:24)
09:57:29       at Object.resolve (node_modules/webdriverio/build/lib/webdriverio.js:191:29)
09:57:29       at lastPromise.then.resolve.call.depth (node_modules/webdriverio/build/lib/webdriverio.js:486:32)
09:57:29       at _fulfilled (node_modules/q/q.js:854:54)
09:57:29       at self.promiseDispatch.done (node_modules/q/q.js:883:30)
09:57:29       at Promise.promise.promiseDispatch (node_modules/q/q.js:816:13)
09:57:29 
09:57:29 Test Suites: 1 failed, 1 total
09:57:29 Tests:       1 failed, 1 total
09:57:29 Snapshots:   0 total
09:57:29 Time:        5.988s, estimated 7s
09:57:29 Ran all test suites.
09:57:29 Killing selenium server ...
Run Code Online (Sandbox Code Playgroud)

如果在我的本地计算机上可以正常运行时为何会失败的任何想法,将不胜感激。另外,我尝试jest.setTimeout在Jest全局安装文件中进行设置,但是会抛出jest.setTimeout is not a function;

https://github.com/facebook/jest/issues/3788

Tha*_*guy 5

我在测试中遇到了类似的情况。我的测试在本地顺利通过,但在 GitHub Actions 上失败了。

我的问题是在本地,测试工具已经下载(在我的例子中是内存中的 MongoDB。在你的例子中是 chrome 浏览器),但在远程环境中,他们必须先下载。

检查您的 Jenkins 日志以了解您的环境下载 chrome,并且在下载达到 100% 之前测试失败。即使你没有发现,你在问题中发布的日志也暗示了这个方向,因为日志打印出超时设置为5000ms,即使你将第一次测试的超时设置为不同的值:

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
Run Code Online (Sandbox Code Playgroud)

这告诉我超时的测试部分是测试之前的部分。

为了解决这个问题,你需要专门为beforeEach函数添加一个更长的超时时间,在那里你初始化 webdriver。这样,在第一次测试中,当 chrome 正在下载时,您将有足够的时间来完成 chrome 的下载。在接下来的测试中,这应该不是问题,因为 chrome 已经可用。 还建议在 Jenkins 中主动下载 chrome\chromium 浏览器,这样它甚至在测试运行开始之前就可用

所以,我建议你试试这个:

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
Run Code Online (Sandbox Code Playgroud)

这是一个旧的 run 的示例,失败是因为内存数据库在超时之前没有完成下载。即使数据库尚未准备好使用,这也会导致测试开始。

将超时添加到我的 beforeEach 函数后,它停止发生。

如果在建议的修复后您仍然面临问题,请随时对此答案发表评论。如果这是正确答案,请不要忘记标记答案:-)