Best JavaScript code snippet using playwright-internal
runner.js
Source:runner.js
...168 locations169 };170 }171 }172 const clashingTests = getClashingTestsPerSuite(preprocessRoot);173 if (clashingTests.size > 0) return {174 status: 'clashing-test-titles',175 clashingTests: clashingTests176 };177 filterOnly(preprocessRoot);178 filterByFocusedLine(preprocessRoot, testFileReFilters);179 const fileSuites = new Map();180 for (const fileSuite of preprocessRoot.suites) fileSuites.set(fileSuite._requireFile, fileSuite);181 const outputDirs = new Set();182 const grepMatcher = (0, _util2.createMatcher)(config.grep);183 const grepInvertMatcher = config.grepInvert ? (0, _util2.createMatcher)(config.grepInvert) : null;184 const rootSuite = new _test.Suite('');185 for (const project of projects) {186 const projectSuite = new _test.Suite(project.config.name);187 rootSuite._addSuite(projectSuite);188 for (const file of files.get(project)) {189 const fileSuite = fileSuites.get(file);190 if (!fileSuite) continue;191 for (let repeatEachIndex = 0; repeatEachIndex < project.config.repeatEach; repeatEachIndex++) {192 const cloned = project.cloneFileSuite(fileSuite, repeatEachIndex, test => {193 const grepTitle = test.titlePath().join(' ');194 if (grepInvertMatcher !== null && grepInvertMatcher !== void 0 && grepInvertMatcher(grepTitle)) return false;195 return grepMatcher(grepTitle);196 });197 if (cloned) projectSuite._addSuite(cloned);198 }199 }200 outputDirs.add(project.config.outputDir);201 }202 let total = rootSuite.allTests().length;203 if (!total) return {204 status: 'no-tests'205 };206 await Promise.all(Array.from(outputDirs).map(outputDir => removeFolderAsync(outputDir).catch(e => {})));207 let testGroups = createTestGroups(rootSuite);208 const shard = config.shard;209 if (shard) {210 const shardGroups = [];211 const shardTests = new Set(); // Each shard gets some tests.212 const shardSize = Math.floor(total / shard.total); // First few shards get one more test each.213 const extraOne = total - shardSize * shard.total;214 const currentShard = shard.current - 1; // Make it zero-based for calculations.215 const from = shardSize * currentShard + Math.min(extraOne, currentShard);216 const to = from + shardSize + (currentShard < extraOne ? 1 : 0);217 let current = 0;218 for (const group of testGroups) {219 // Any test group goes to the shard that contains the first test of this group.220 // So, this shard gets any group that starts at [from; to)221 if (current >= from && current < to) {222 shardGroups.push(group);223 for (const test of group.tests) shardTests.add(test);224 }225 current += group.tests.length;226 }227 testGroups = shardGroups;228 filterSuite(rootSuite, () => false, test => shardTests.has(test));229 total = rootSuite.allTests().length;230 }231 if (process.stdout.isTTY) {232 console.log();233 const jobs = Math.min(config.workers, testGroups.length);234 const shardDetails = shard ? `, shard ${shard.current} of ${shard.total}` : '';235 console.log(`Running ${total} test${total > 1 ? 's' : ''} using ${jobs} worker${jobs > 1 ? 's' : ''}${shardDetails}`);236 }237 let sigint = false;238 let sigintCallback;239 const sigIntPromise = new Promise(f => sigintCallback = f);240 const sigintHandler = () => {241 // We remove the handler so that second Ctrl+C immediately kills the runner242 // via the default sigint handler. This is handy in the case where our shutdown243 // takes a lot of time or is buggy.244 //245 // When running through NPM we might get multiple SIGINT signals246 // for a single Ctrl+C - this is an NPM bug present since at least NPM v6.247 // https://github.com/npm/cli/issues/1591248 // https://github.com/npm/cli/issues/2124249 //250 // Therefore, removing the handler too soon will just kill the process251 // with default handler without printing the results.252 // We work around this by giving NPM 1000ms to send us duplicate signals.253 // The side effect is that slow shutdown or bug in our runner will force254 // the user to hit Ctrl+C again after at least a second.255 setTimeout(() => process.off('SIGINT', sigintHandler), 1000);256 sigint = true;257 sigintCallback();258 };259 process.on('SIGINT', sigintHandler);260 (_this$_reporter$onBeg2 = (_this$_reporter3 = this._reporter).onBegin) === null || _this$_reporter$onBeg2 === void 0 ? void 0 : _this$_reporter$onBeg2.call(_this$_reporter3, config, rootSuite);261 this._didBegin = true;262 let hasWorkerErrors = false;263 if (!list) {264 const dispatcher = new _dispatcher.Dispatcher(this._loader, testGroups, this._reporter);265 await Promise.race([dispatcher.run(), sigIntPromise]);266 await dispatcher.stop();267 hasWorkerErrors = dispatcher.hasWorkerErrors();268 }269 if (sigint) {270 var _this$_reporter$onEnd2, _this$_reporter4;271 await ((_this$_reporter$onEnd2 = (_this$_reporter4 = this._reporter).onEnd) === null || _this$_reporter$onEnd2 === void 0 ? void 0 : _this$_reporter$onEnd2.call(_this$_reporter4, {272 status: 'interrupted'273 }));274 return {275 status: 'sigint'276 };277 }278 const failed = hasWorkerErrors || rootSuite.allTests().some(test => !test.ok());279 await ((_this$_reporter$onEnd3 = (_this$_reporter5 = this._reporter).onEnd) === null || _this$_reporter$onEnd3 === void 0 ? void 0 : _this$_reporter$onEnd3.call(_this$_reporter5, {280 status: failed ? 'failed' : 'passed'281 }));282 return {283 status: failed ? 'failed' : 'passed'284 };285 } finally {286 if (globalSetupResult && typeof globalSetupResult === 'function') await globalSetupResult(this._loader.fullConfig());287 if (config.globalTeardown) await (await this._loader.loadGlobalHook(config.globalTeardown, 'globalTeardown'))(this._loader.fullConfig());288 await (webServer === null || webServer === void 0 ? void 0 : webServer.kill());289 }290 }291}292exports.Runner = Runner;293function filterOnly(suite) {294 const suiteFilter = suite => suite._only;295 const testFilter = test => test._only;296 return filterSuite(suite, suiteFilter, testFilter);297}298function filterByFocusedLine(suite, focusedTestFileLines) {299 const testFileLineMatches = (testFileName, testLine) => focusedTestFileLines.some(({300 re,301 line302 }) => {303 re.lastIndex = 0;304 return re.test(testFileName) && (line === testLine || line === null);305 });306 const suiteFilter = suite => !!suite.location && testFileLineMatches(suite.location.file, suite.location.line);307 const testFilter = test => testFileLineMatches(test.location.file, test.location.line);308 return filterSuite(suite, suiteFilter, testFilter);309}310function filterSuite(suite, suiteFilter, testFilter) {311 const onlySuites = suite.suites.filter(child => filterSuite(child, suiteFilter, testFilter) || suiteFilter(child));312 const onlyTests = suite.tests.filter(testFilter);313 const onlyEntries = new Set([...onlySuites, ...onlyTests]);314 if (onlyEntries.size) {315 suite.suites = onlySuites;316 suite.tests = onlyTests;317 suite._entries = suite._entries.filter(e => onlyEntries.has(e)); // Preserve the order.318 return true;319 }320 return false;321}322async function collectFiles(testDir) {323 const checkIgnores = (entryPath, rules, isDirectory, parentStatus) => {324 let status = parentStatus;325 for (const rule of rules) {326 const ruleIncludes = rule.negate;327 if (status === 'included' === ruleIncludes) continue;328 const relative = path.relative(rule.dir, entryPath);329 if (rule.match('/' + relative) || rule.match(relative)) {330 // Matches "/dir/file" or "dir/file"331 status = ruleIncludes ? 'included' : 'ignored';332 } else if (isDirectory && (rule.match('/' + relative + '/') || rule.match(relative + '/'))) {333 // Matches "/dir/subdir/" or "dir/subdir/" for directories.334 status = ruleIncludes ? 'included' : 'ignored';335 } else if (isDirectory && ruleIncludes && (rule.match('/' + relative, true) || rule.match(relative, true))) {336 // Matches "/dir/donotskip/" when "/dir" is excluded, but "!/dir/donotskip/file" is included.337 status = 'ignored-but-recurse';338 }339 }340 return status;341 };342 const files = [];343 const visit = async (dir, rules, status) => {344 const entries = await readDirAsync(dir, {345 withFileTypes: true346 });347 entries.sort((a, b) => a.name.localeCompare(b.name));348 const gitignore = entries.find(e => e.isFile() && e.name === '.gitignore');349 if (gitignore) {350 const content = await readFileAsync(path.join(dir, gitignore.name), 'utf8');351 const newRules = content.split(/\r?\n/).map(s => {352 s = s.trim();353 if (!s) return; // Use flipNegate, because we handle negation ourselves.354 const rule = new _minimatch.Minimatch(s, {355 matchBase: true,356 dot: true,357 flipNegate: true358 });359 if (rule.comment) return;360 rule.dir = dir;361 return rule;362 }).filter(rule => !!rule);363 rules = [...rules, ...newRules];364 }365 for (const entry of entries) {366 if (entry === gitignore || entry.name === '.' || entry.name === '..') continue;367 if (entry.isDirectory() && entry.name === 'node_modules') continue;368 const entryPath = path.join(dir, entry.name);369 const entryStatus = checkIgnores(entryPath, rules, entry.isDirectory(), status);370 if (entry.isDirectory() && entryStatus !== 'ignored') await visit(entryPath, rules, entryStatus);else if (entry.isFile() && entryStatus === 'included') files.push(entryPath);371 }372 };373 await visit(testDir, [], 'included');374 return files;375}376function getClashingTestsPerSuite(rootSuite) {377 function visit(suite, clashingTests) {378 for (const childSuite of suite.suites) visit(childSuite, clashingTests);379 for (const test of suite.tests) {380 const fullTitle = test.titlePath().slice(2).join(' ');381 if (!clashingTests.has(fullTitle)) clashingTests.set(fullTitle, []);382 clashingTests.set(fullTitle, clashingTests.get(fullTitle).concat(test));383 }384 }385 const out = new Map();386 for (const fileSuite of rootSuite.suites) {387 const clashingTests = new Map();388 visit(fileSuite, clashingTests);389 for (const [title, tests] of clashingTests.entries()) {390 if (tests.length > 1) out.set(title, tests);...
Using AI Code Generation
1const { chromium } = require('playwright');2const fs = require('fs');3(async () => {4 const browser = await chromium.launch({ headless: false, slowMo: 1000 });5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.goto('
Using AI Code Generation
1const playwright = require('playwright');2const { getClashingTestsPerSuite } = require('playwright/lib/test/runner');3const { Test } = require('playwright/lib/test/test');4const { Suite } = require('playwright/lib/test/suite');5const { PlaywrightTestConfig } = require('playwright/lib/test/types');6const test1 = new Test('test1', async () => {}, {});7const test2 = new Test('test2', async () => {}, {});8const test3 = new Test('test3', async () => {}, {});9const test4 = new Test('test4', async () => {}, {});10const test5 = new Test('test5', async () => {}, {});11const suite1 = new Suite('suite1', undefined, [test1, test2, test3]);12const suite2 = new Suite('suite2', undefined, [test4, test5]);13const suite3 = new Suite('suite3', undefined, [suite1, suite2]);14const config = new PlaywrightTestConfig();15config.rootDir = __dirname;16(async () => {17 const results = await getClashingTestsPerSuite(suite3, config);18 console.log(results);19 await playwright.close();20})();
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('playwright/test');2const { test } = require('@playwright/test');3test.describe('Suite 1', () => {4 test('Test 1', async ({ page }) => {5 });6 test('Test 2', async ({ page }) => {7 });8});9test.describe('Suite 2', () => {10 test('Test 1', async ({ page }) => {11 });12 test('Test 2', async ({ page }) => {13 });14});15const clashingTests = getClashingTestsPerSuite();16console.log(clashingTests);17const { getClashingTestsPerSuite } = require('playwright/test');18const { test } = require('@playwright/test');19test.describe('Suite 1', () => {20 test('Test 1', async ({ page }) => {21 });22 test('Test 2', async ({ page }) => {23 });24});25test.describe('Suite 2', () => {26 test('Test 1', async ({ page }) => {27 });28 test('Test 2', async ({ page }) => {29 });30});31const clashingTests = getClashingTestsPerSuite();32console.log(clashingTests);33const { getClashingTestsPerSuite } = require('playwright/test');34const { test } = require('@playwright/test');35test.describe('Suite 1', () => {36 test('Test 1', async ({
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('@playwright/test/lib/test');2const { test } = require('@playwright/test');3test.describe('Suite 1', () => {4 test('Test 1', async ({ page }) => {5 });6 test('Test 2', async ({ page }) => {7 });8 test('Test 3', async ({ page }) => {9 });10});11test.describe('Suite 2', () => {12 test('Test 1', async ({ page }) => {13 });14 test('Test 2', async ({ page }) => {15 });16 test('Test 3', async ({ page }) => {17 });18});19test.describe('Suite 3', () => {20 test('Test 1', async ({ page }) => {21 });22 test('Test 2', async ({ page }) => {23 });24 test('Test 3', async ({ page }) => {25 });26});27test.describe('Suite 4', () => {28 test('Test 1', async ({ page }) => {29 });30 test('Test 2', async ({ page }) => {31 });32 test('Test 3', async ({ page }) => {33 });34});35test.describe('Suite 5', () => {36 test('Test 1', async ({ page }) => {37 });38 test('Test 2', async ({ page }) => {39 });40 test('Test 3', async ({ page }) => {41 });42});43test.describe('Suite 6', () => {44 test('Test 1', async ({ page }) => {
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('@playwright/test/lib/test/workerRunner');2const { expect } = require('@playwright/test');3(async () => {4 const clashingTestsPerSuite = await getClashingTestsPerSuite();5 expect(clashingTestsPerSuite).toMatchSnapshot();6})();7{8}
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('@playwright/test/lib/test');2const clashingTests = getClashingTestsPerSuite();3console.log(clashingTests);4for (const [suite, tests] of clashingTests) {5 console.log(`Suite: ${suite}`);6 for (const test of tests) {7 console.log(` - ${test}`);8 }9}
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('@playwright/test/lib/test');2const clashingTestsPerSuite = getClashingTestsPerSuite();3console.log(clashingTestsPerSuite);4{5}6module.exports = {7 {8 },9 {10 },11};
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('playwright/lib/test/runner');2const { expect } = require('playwright/lib/utils/expect');3const test1 = async ({ page }) => {4 expect(page.locator('text=Get started')).toBeVisible();5};6test1.title = 'test1';7const test2 = async ({ page }) => {8 expect(page.locator('text=Get started')).toBeVisible();9};10test2.title = 'test2';11const test3 = async ({ page }) => {12 expect(page.locator('text=Get started')).toBeVisible();13};14test3.title = 'test3';15const test4 = async ({ page }) => {16 expect(page.locator('text=Get started')).toBeVisible();17};18test4.title = 'test4';19const test5 = async ({ page }) => {20 expect(page.locator('text=Get started')).toBeVisible();21};22test5.title = 'test5';23const test6 = async ({ page }) => {24 expect(page.locator('text=Get started')).toBeVisible();25};26test6.title = 'test6';27const test7 = async ({ page }) => {28 expect(page.locator('text=Get started')).toBeVisible();29};30test7.title = 'test7';31const test8 = async ({ page }) => {32 expect(page.locator('text=Get started')).toBeVisible();33};34test8.title = 'test8';35const test9 = async ({ page }) => {36 expect(page.locator('text=Get started')).toBeVisible();37};38test9.title = 'test9';39const test10 = async ({ page }) => {40 expect(page.locator('text=Get started')).toBeVisible();41};42test10.title = 'test10';43const test11 = async ({ page }) => {44 expect(page
Using AI Code Generation
1const { getClashingTestsPerSuite } = require('playwright-core/lib/server/test');2const tests = getClashingTestsPerSuite('test1', 'test2');3console.log(tests);4const { test } = require('playwright-core/lib/server/test');5test('test1', async ({ page }) => {6});7const { test } = require('playwright-core/lib/server/test');8test('test2', async ({ page }) => {9});10 {11 {12 }13 },14 {15 {16 }17 }
Using AI Code Generation
1const { Playwright } = require('@playwright/test');2const playwright = new Playwright();3playwright.getClashingTestsPerSuite();4const test = require('@playwright/test');5test.describe('test1', () => {6 test('test1', () => {});7 test('test2', () => {});8});9const test = require('@playwright/test');10test.describe('test2', () => {11 test('test1', () => {});12});13const test = require('@playwright/test');14test.describe('test3', () => {15 test('test1', () => {});16});17const test = require('@playwright/test');18test.describe('test4', () => {19 test('test1', () => {});20});21const test = require('@playwright/test');22test.describe('test5', () => {23 test('test1', () => {});24});25const test = require('@playwright/test');26test.describe('test6', () => {27 test('test1', () => {});28});29const test = require('@playwright/test');30test.describe('test7', () => {31 test('test1', () => {});32});33const test = require('@playwright/test');34test.describe('test8', () => {35 test('test1', () => {});36});37const test = require('@playwright/test');38test.describe('test9', () => {39 test('test1', () => {});40});41const test = require('@playwright/test');42test.describe('test10', () => {43 test('test1', () => {});44});45const test = require('@playwright/test');46test.describe('test11', () => {47 test('test1', () => {});48});49const test = require('@playwright/test');50test.describe('test12', () => {51 test('test
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!