diff --git a/packages/playwright-core/src/server/injected/selectorGenerator.ts b/packages/playwright-core/src/server/injected/selectorGenerator.ts
index 06ba6c13c0..93e2526213 100644
--- a/packages/playwright-core/src/server/injected/selectorGenerator.ts
+++ b/packages/playwright-core/src/server/injected/selectorGenerator.ts
@@ -224,7 +224,7 @@ function cssFallback(injectedScript: InjectedScript, targetElement: Element, str
const path = tokens.slice();
if (prefix)
path.unshift(prefix);
- const selector = path.join(' ');
+ const selector = path.join(' > ');
const parsedSelector = injectedScript.parseSelector(selector);
const node = injectedScript.querySelector(parsedSelector, targetElement.ownerDocument, false);
return node === targetElement ? selector : undefined;
diff --git a/tests/library/selector-generator.spec.ts b/tests/library/selector-generator.spec.ts
index 95b7cae875..cef94b4d24 100644
--- a/tests/library/selector-generator.spec.ts
+++ b/tests/library/selector-generator.spec.ts
@@ -191,7 +191,28 @@ it.describe('selector generator', () => {
`);
- expect(await generate(page, 'c[mark="1"]')).toBe('b:nth-child(2) c');
+ expect(await generate(page, 'c[mark="1"]')).toBe('b:nth-child(2) > c');
+ });
+
+ it('should properly join child selectors under nested ordinals', async ({ page }) => {
+ await page.setContent(`
+