From 8d25f2ef59f7605bee29d9ee7f1ec11c7cdbd20d Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 6 Sep 2022 14:15:53 -0700 Subject: [PATCH] fix(selectors): allow custom engines in out-of-process (#17139) --- packages/playwright-test/src/index.ts | 5 +++- tests/config/testModeFixtures.ts | 2 ++ tests/library/selectors-register.spec.ts | 38 +++++++++++++++++++----- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/packages/playwright-test/src/index.ts b/packages/playwright-test/src/index.ts index 7ab2d246c0..b1b8c18b36 100644 --- a/packages/playwright-test/src/index.ts +++ b/packages/playwright-test/src/index.ts @@ -25,6 +25,7 @@ export { expect } from './expect'; export const _baseTest: TestType<{}, {}> = rootTestType.test; export { addRunnerPlugin as _addRunnerPlugin } from './plugins'; import * as outOfProcess from 'playwright-core/lib/outofprocess'; +import * as playwrightLibrary from 'playwright-core'; import type { TestInfoImpl } from './testInfo'; if ((process as any)['__pw_initiator__']) { @@ -61,7 +62,9 @@ export const test = _baseTest.extend({ const impl = await outOfProcess.start({ NODE_OPTIONS: undefined // Hide driver process while debugging. }); - await use(impl.playwright as any); + const pw = impl.playwright as any; + pw._setSelectors(playwrightLibrary.selectors); + await use(pw); await impl.stop(); } else { await use(require('playwright-core')); diff --git a/tests/config/testModeFixtures.ts b/tests/config/testModeFixtures.ts index f4029c8af8..43d7974729 100644 --- a/tests/config/testModeFixtures.ts +++ b/tests/config/testModeFixtures.ts @@ -17,6 +17,7 @@ import { test } from '@playwright/test'; import type { TestModeName } from './testMode'; import { DefaultTestMode, DriverTestMode } from './testMode'; +import * as playwrightLibrary from 'playwright-core'; export type TestModeWorkerOptions = { mode: TestModeName; @@ -42,6 +43,7 @@ export const testModeTest = test.extend ({ + query(root, selector) { + return root.querySelector(selector); + }, + queryAll(root, selector) { + return Array.from(root.querySelectorAll(selector)); + } +}); + it('should work', async ({ playwright, browser }) => { - const createTagSelector = () => ({ - query(root, selector) { - return root.querySelector(selector); - }, - queryAll(root, selector) { - return Array.from(root.querySelectorAll(selector)); - } - }); // Register one engine before creating context. await playwright.selectors.register('tag', `(${createTagSelector.toString()})()`); @@ -51,6 +52,27 @@ it('should work', async ({ playwright, browser }) => { await context.close(); }); +it('should work when registered on global', async ({ browser }) => { + await require('@playwright/test').selectors.register('oop-tag', `(${createTagSelector.toString()})()`); + + const context = await browser.newContext(); + // Register another engine after creating context. + await require('@playwright/test').selectors.register('oop-tag2', `(${createTagSelector.toString()})()`); + + const page = await context.newPage(); + await page.setContent('
'); + + expect(await page.$eval('oop-tag=DIV', e => e.nodeName)).toBe('DIV'); + expect(await page.$eval('oop-tag=SPAN', e => e.nodeName)).toBe('SPAN'); + expect(await page.$$eval('oop-tag=DIV', es => es.length)).toBe(2); + + expect(await page.$eval('oop-tag2=DIV', e => e.nodeName)).toBe('DIV'); + expect(await page.$eval('oop-tag2=SPAN', e => e.nodeName)).toBe('SPAN'); + expect(await page.$$eval('oop-tag2=DIV', es => es.length)).toBe(2); + + await context.close(); +}); + it('should work with path', async ({ playwright, browser, asset }) => { const page = await browser.newPage(); await playwright.selectors.register('foo', { path: asset('sectionselectorengine.js') });