From 672f50c0aea85f3707db2744285290399b116223 Mon Sep 17 00:00:00 2001 From: Will Date: Sat, 19 Mar 2022 22:42:58 -0400 Subject: [PATCH 1/2] wdio-utils: Filter out internal stacktraces --- .../src/test-framework/testFnWrapper.ts | 21 +++++++++++ .../testFnWrapper-async.test.js | 36 ++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/wdio-utils/src/test-framework/testFnWrapper.ts b/packages/wdio-utils/src/test-framework/testFnWrapper.ts index 1d407e65eb3..18767bd3a4e 100644 --- a/packages/wdio-utils/src/test-framework/testFnWrapper.ts +++ b/packages/wdio-utils/src/test-framework/testFnWrapper.ts @@ -10,6 +10,11 @@ import type { JasmineContext } from './types' +const STACKTRACE_FILTER = [ + 'node_modules', + '(internal/process/task', +] + /** * wraps test framework spec/hook function with WebdriverIO before/after hooks * @@ -77,6 +82,10 @@ export const testFrameworkFnWrapper = async function ( try { result = await promise } catch (err: any) { + if (err.stack) { + err.stack = filterStackTrace(err.stack) + } + error = err } const duration = Date.now() - testStart @@ -106,3 +115,15 @@ export const testFrameworkFnWrapper = async function ( } return result } + +/** + * Filter out internal stacktraces. exporting to allow testing of the function + * @param {string} stack Stacktrace + * @returns {string} + */ +export const filterStackTrace = (stack: string): string => { + return stack + .split('\n') + .filter(line => !STACKTRACE_FILTER.some(l => line.includes(l))) + .join('\n') +} diff --git a/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js b/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js index 9aa2c8d6d49..e7fd45885fd 100644 --- a/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js +++ b/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js @@ -1,5 +1,5 @@ import * as shim from '../../src/shim' -import { testFnWrapper } from '../../src/test-framework/testFnWrapper' +import { testFnWrapper, filterStackTrace } from '../../src/test-framework/testFnWrapper' jest.mock('../../src/shim', () => ({ executeHooksWithArgs: jest.fn(), @@ -91,3 +91,37 @@ describe('testFnWrapper', () => { executeHooksWithArgs.mockClear() }) }) + +describe('filterStackTrace', () => { + it('should remove internal webdriverio lines only', () => { + const stackTraces = [ + { + fullStack : ` + at Context. (/foo/bar/baz/example.e2e.js:27:9) + at Context.executeAsync (/foo/bar/baz/node_modules/@wdio/utils/build/shim.js:331:27) + at Context.testFrameworkFnWrapper (/foo/bar/baz/node_modules/@wdio/utils/build/test-framework/testFnWrapper.js:50:32) + at processTicksAndRejections (internal/process/task_queues.js:95:5) + `, + filteredStack : ` + at Context. (/foo/bar/baz/example.e2e.js:27:9) + ` + }, + { + fullStack : ` + at implicitWait (/foo/bar/node_modules/webdriverio/build/utils/implicitWait.js:34:19) + at async Element.elementErrorHandlerCallbackFn (/foo/bar/node_modules/webdriverio/build/middlewares.js:20:29) + at async Element.wrapCommandFn (/foo/bar/node_modules/@wdio/utils/build/shim.js:137:29) + at async Context. (/foo/bar/test/specs/example.e2e.ts:8:9) + at processTicksAndRejections (internal/process/task_queues.js:95:5) + `, + filteredStack : ` + at async Context. (/foo/bar/test/specs/example.e2e.ts:8:9) + ` + } + ] + + for (const { fullStack, filteredStack } of stackTraces) { + expect(filteredStack).toBe(filterStackTrace(fullStack)) + } + }) +}) From f375c1aebd0918ff576ae0134a4d80f58abf96e6 Mon Sep 17 00:00:00 2001 From: Will Date: Wed, 23 Mar 2022 07:22:19 -0400 Subject: [PATCH 2/2] wdio-utils: Only filter out webdriverio specific interanl stacktraces --- packages/wdio-utils/src/test-framework/testFnWrapper.ts | 4 +++- .../tests/test-framework/testFnWrapper-async.test.js | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/wdio-utils/src/test-framework/testFnWrapper.ts b/packages/wdio-utils/src/test-framework/testFnWrapper.ts index 18767bd3a4e..7b63dd06792 100644 --- a/packages/wdio-utils/src/test-framework/testFnWrapper.ts +++ b/packages/wdio-utils/src/test-framework/testFnWrapper.ts @@ -11,7 +11,9 @@ import type { } from './types' const STACKTRACE_FILTER = [ - 'node_modules', + 'node_modules/webdriver/', + 'node_modules/webdriverio/', + 'node_modules/@wdio/', '(internal/process/task', ] diff --git a/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js b/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js index e7fd45885fd..3fa9606472c 100644 --- a/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js +++ b/packages/wdio-utils/tests/test-framework/testFnWrapper-async.test.js @@ -111,10 +111,12 @@ describe('filterStackTrace', () => { at implicitWait (/foo/bar/node_modules/webdriverio/build/utils/implicitWait.js:34:19) at async Element.elementErrorHandlerCallbackFn (/foo/bar/node_modules/webdriverio/build/middlewares.js:20:29) at async Element.wrapCommandFn (/foo/bar/node_modules/@wdio/utils/build/shim.js:137:29) + at async Element.wrapCommandFn (/foo/bar/node_modules/some/fake/lib/bar.js:137:29) at async Context. (/foo/bar/test/specs/example.e2e.ts:8:9) at processTicksAndRejections (internal/process/task_queues.js:95:5) `, filteredStack : ` + at async Element.wrapCommandFn (/foo/bar/node_modules/some/fake/lib/bar.js:137:29) at async Context. (/foo/bar/test/specs/example.e2e.ts:8:9) ` }