Fail playwright tests when console errors exists (#3345)
* initial console error whitelist * add testInfo to the beforeEach * set COLLECT_CONSOLE_ERRORS * add more console errors * temporarily set max_retrys to 0 instead of 4 * more console errors * revert max retries back to 4 * add 'necessary' to complete sentence * tweak env var name * update whitelist * test disabling flag * update whitelist * lint + enable for chrome only * re-enabled on CI * re-order whitelist * create failOnConsoleErrors * try update list * add more to list * tweak list again * tweak again< * tweak again * tweak * testInfo * increase timeout --------- Co-authored-by: ryanrosello-og <ry@zoo.dev> Co-authored-by: Jess Frazelle <jessfraz@users.noreply.github.com> Co-authored-by: Kurt Hutten Irev-Dev <k.hutten@protonmail.ch>
This commit is contained in:
		@ -26,6 +26,7 @@ import {
 | 
			
		||||
import * as TOML from '@iarna/toml'
 | 
			
		||||
import { SaveSettingsPayload } from 'lib/settings/settingsTypes'
 | 
			
		||||
import { SETTINGS_FILE_NAME } from 'lib/constants'
 | 
			
		||||
import { isErrorWhitelisted } from './lib/console-error-whitelist'
 | 
			
		||||
import { isArray } from 'lib/utils'
 | 
			
		||||
import { reportRejection } from 'lib/trap'
 | 
			
		||||
 | 
			
		||||
@ -822,7 +823,11 @@ export async function tearDown(page: Page, testInfo: TestInfo) {
 | 
			
		||||
 | 
			
		||||
// settingsOverrides may need to be augmented to take more generic items,
 | 
			
		||||
// but we'll be strict for now
 | 
			
		||||
export async function setup(context: BrowserContext, page: Page) {
 | 
			
		||||
export async function setup(
 | 
			
		||||
  context: BrowserContext,
 | 
			
		||||
  page: Page,
 | 
			
		||||
  testInfo?: TestInfo
 | 
			
		||||
) {
 | 
			
		||||
  await context.addInitScript(
 | 
			
		||||
    async ({ token, settingsKey, settings, IS_PLAYWRIGHT_KEY }) => {
 | 
			
		||||
      localStorage.clear()
 | 
			
		||||
@ -858,6 +863,8 @@ export async function setup(context: BrowserContext, page: Page) {
 | 
			
		||||
      secure: true,
 | 
			
		||||
    },
 | 
			
		||||
  ])
 | 
			
		||||
 | 
			
		||||
  failOnConsoleErrors(page, testInfo)
 | 
			
		||||
  // kill animations, speeds up tests and reduced flakiness
 | 
			
		||||
  await page.emulateMedia({ reducedMotion: 'reduce' })
 | 
			
		||||
 | 
			
		||||
@ -931,6 +938,48 @@ export async function setupElectron({
 | 
			
		||||
  return { electronApp, page, dir: projectDirName }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function failOnConsoleErrors(page: Page, testInfo?: TestInfo) {
 | 
			
		||||
  // enabled for chrome for now
 | 
			
		||||
  if (page.context().browser()?.browserType().name() === 'chromium') {
 | 
			
		||||
    page.on('pageerror', (exception) => {
 | 
			
		||||
      if (isErrorWhitelisted(exception)) {
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // only set this env var to false if you want to collect console errors
 | 
			
		||||
      // This can be configured in the GH workflow.  This should be set to true by default (we want tests to fail when
 | 
			
		||||
      // unwhitelisted console errors are detected).
 | 
			
		||||
      if (process.env.FAIL_ON_CONSOLE_ERRORS === 'true') {
 | 
			
		||||
        // Fail when running on CI and FAIL_ON_CONSOLE_ERRORS is set
 | 
			
		||||
        // use expect to prevent page from closing and not cleaning up
 | 
			
		||||
        expect(`An error was detected in the console: \r\n message:${exception.message} \r\n name:${exception.name} \r\n stack:${exception.stack}
 | 
			
		||||
          
 | 
			
		||||
          *Either fix the console error or add it to the whitelist defined in ./lib/console-error-whitelist.ts (if the error can be safely ignored)       
 | 
			
		||||
          `).toEqual('Console error detected')
 | 
			
		||||
      } else {
 | 
			
		||||
        // the (test-results/exceptions.txt) file will be uploaded as part of an upload artifact in GH
 | 
			
		||||
        fsp
 | 
			
		||||
          .appendFile(
 | 
			
		||||
            './test-results/exceptions.txt',
 | 
			
		||||
            [
 | 
			
		||||
              '~~~',
 | 
			
		||||
              `triggered_by_test:${
 | 
			
		||||
                testInfo?.file + ' ' + (testInfo?.title || ' ')
 | 
			
		||||
              }`,
 | 
			
		||||
              `name:${exception.name}`,
 | 
			
		||||
              `message:${exception.message}`,
 | 
			
		||||
              `stack:${exception.stack}`,
 | 
			
		||||
              `project:${testInfo?.project.name}`,
 | 
			
		||||
              '~~~',
 | 
			
		||||
            ].join('\n')
 | 
			
		||||
          )
 | 
			
		||||
          .catch((err) => {
 | 
			
		||||
            console.error(err)
 | 
			
		||||
          })
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
export async function isOutOfViewInScrollContainer(
 | 
			
		||||
  element: Locator,
 | 
			
		||||
  container: Locator
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user