diff --git a/packages/playwright-core/src/server/injected/highlight.ts b/packages/playwright-core/src/server/injected/highlight.ts
index e90d1fc52b..a584adfd6e 100644
--- a/packages/playwright-core/src/server/injected/highlight.ts
+++ b/packages/playwright-core/src/server/injected/highlight.ts
@@ -54,10 +54,7 @@ export class Highlight {
this._actionPointElement = document.createElement('x-pw-action-point');
this._actionPointElement.setAttribute('hidden', 'true');
-
- // NOTE: do not use an open shadow root, event for test.
- // Closed shadow root prevents selectors matching our internal previews.
- this._glassPaneShadow = this._glassPaneElement.attachShadow({ mode: 'closed' });
+ this._glassPaneShadow = this._glassPaneElement.attachShadow({ mode: this._isUnderTest ? 'open' : 'closed' });
this._glassPaneShadow.appendChild(this._actionPointElement);
const styleElement = document.createElement('style');
styleElement.textContent = `
@@ -182,8 +179,6 @@ export class Highlight {
tooltipElement.style.top = '0';
tooltipElement.style.left = '0';
tooltipElement.style.display = 'flex';
- if (this._isUnderTest)
- console.error('Highlight text for test: ' + JSON.stringify(tooltipElement.textContent)); // eslint-disable-line no-console
}
this._highlightEntries.push({ targetElement: elements[i], tooltipElement, highlightElement });
}
diff --git a/packages/playwright-core/src/server/injected/recorder.ts b/packages/playwright-core/src/server/injected/recorder.ts
index ae974af105..8b6ea24270 100644
--- a/packages/playwright-core/src/server/injected/recorder.ts
+++ b/packages/playwright-core/src/server/injected/recorder.ts
@@ -74,7 +74,7 @@ class Recorder {
addEventListener(document, 'mouseup', event => this._onMouseUp(event as MouseEvent), true),
addEventListener(document, 'mousemove', event => this._onMouseMove(event as MouseEvent), true),
addEventListener(document, 'mouseleave', event => this._onMouseLeave(event as MouseEvent), true),
- addEventListener(document, 'focus', () => this._onFocus(), true),
+ addEventListener(document, 'focus', () => this._onFocus(true), true),
addEventListener(document, 'scroll', () => {
this._hoveredModel = null;
this._highlight.hideActionPoint();
@@ -234,12 +234,13 @@ class Recorder {
}
}
- private _onFocus() {
+ private _onFocus(userGesture: boolean) {
const activeElement = this._deepActiveElement(document);
const result = activeElement ? generateSelector(this._injectedScript, activeElement, true) : null;
this._activeModel = result && result.selector ? result : null;
- if (this._injectedScript.isUnderTest)
- console.error('Highlight updated for test: ' + (result ? result.selector : null)); // eslint-disable-line no-console
+ if (userGesture)
+ this._hoveredElement = activeElement as HTMLElement | null;
+ this._updateModelForHoveredElement();
}
private _updateModelForHoveredElement() {
@@ -250,12 +251,10 @@ class Recorder {
}
const hoveredElement = this._hoveredElement;
const { selector, elements } = generateSelector(this._injectedScript, hoveredElement, true);
- if ((this._hoveredModel && this._hoveredModel.selector === selector) || this._hoveredElement !== hoveredElement)
+ if ((this._hoveredModel && this._hoveredModel.selector === selector))
return;
this._hoveredModel = selector ? { selector, elements } : null;
this._updateHighlight();
- if (this._injectedScript.isUnderTest)
- console.error('Highlight updated for test: ' + selector); // eslint-disable-line no-console
}
private _updateHighlight() {
@@ -392,10 +391,8 @@ class Recorder {
await globalThis.__pw_recorderPerformAction(action).catch(() => {});
this._performingAction = false;
- // Action could have changed DOM, update hovered model selectors.
- this._updateModelForHoveredElement();
// If that was a keyboard action, it similarly requires new selectors for active model.
- this._onFocus();
+ this._onFocus(false);
if (this._injectedScript.isUnderTest) {
// Serialize all to string as we cannot attribute console message to isolated world
diff --git a/tests/library/inspector/cli-codegen-1.spec.ts b/tests/library/inspector/cli-codegen-1.spec.ts
index 8b63d7817e..08a9c982ba 100644
--- a/tests/library/inspector/cli-codegen-1.spec.ts
+++ b/tests/library/inspector/cli-codegen-1.spec.ts
@@ -25,8 +25,8 @@ test.describe('cli codegen', () => {
await recorder.setContentAndWait(``);
- const selector = await recorder.hoverOverElement('button');
- expect(selector).toBe('internal:role=button[name=\"Submit\"]');
+ const locator = await recorder.hoverOverElement('button');
+ expect(locator).toBe(`getByRole('button', { name: 'Submit' })`);
const [message, sources] = await Promise.all([
page.waitForEvent('console', msg => msg.type() !== 'error'),
@@ -68,8 +68,8 @@ test.describe('cli codegen', () => {
// the second unnecessary copy of the recorder script.
await page.waitForTimeout(1000);
- const selector = await recorder.hoverOverElement('button');
- expect(selector).toBe('internal:role=button[name=\"Submit\"]');
+ const locator = await recorder.hoverOverElement('button');
+ expect(locator).toBe(`getByRole('button', { name: 'Submit' })`);
const [message, sources] = await Promise.all([
page.waitForEvent('console', msg => msg.type() !== 'error'),
@@ -95,10 +95,10 @@ test.describe('cli codegen', () => {
`);
- const selector = await recorder.waitForHighlight(() => recorder.page.hover('canvas', {
+ const locator = await recorder.waitForHighlight(() => recorder.page.hover('canvas', {
position: { x: 250, y: 250 },
}));
- expect(selector).toBe('canvas');
+ expect(locator).toBe(`locator('canvas')`);
const [message, sources] = await Promise.all([
page.waitForEvent('console', msg => msg.type() !== 'error'),
recorder.waitForOutput('JavaScript', 'click'),
@@ -148,8 +148,8 @@ test.describe('cli codegen', () => {