From 7609785d539b0d6f558a7610655acecfc27c36c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Tue, 5 Jul 2022 16:49:31 +0200 Subject: [PATCH] fix: Detects React 17+ first (#15343) --- .../server/injected/reactSelectorEngine.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/playwright-core/src/server/injected/reactSelectorEngine.ts b/packages/playwright-core/src/server/injected/reactSelectorEngine.ts index 1808f71218..ac0015265c 100644 --- a/packages/playwright-core/src/server/injected/reactSelectorEngine.ts +++ b/packages/playwright-core/src/server/injected/reactSelectorEngine.ts @@ -145,17 +145,17 @@ function findReactRoots(root: Document | ShadowRoot, roots: ReactVNode[] = []): const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); do { const node = walker.currentNode; - // ReactDOM Legacy client API: - // @see https://github.com/baruchvlz/resq/blob/5c15a5e04d3f7174087248f5a158c3d6dcc1ec72/src/utils.js#L329 - if (node.hasOwnProperty('_reactRootContainer')) { + + // React 17+ + // React sets rootKey when mounting + // @see https://github.com/facebook/react/blob/a724a3b578dce77d427bef313102a4d0e978d9b4/packages/react-dom/src/client/ReactDOMComponentTree.js#L62-L64 + const rootKey = Object.keys(node).find(key => key.startsWith('__reactContainer')); + if (rootKey) { + roots.push((node as any)[rootKey].stateNode.current); + } else if (node.hasOwnProperty('_reactRootContainer')) { + // ReactDOM Legacy client API: + // @see https://github.com/baruchvlz/resq/blob/5c15a5e04d3f7174087248f5a158c3d6dcc1ec72/src/utils.js#L329 roots.push((node as any)._reactRootContainer._internalRoot.current); - } else { - // React 17+ - // React sets rootKey when mounting - // @see https://github.com/facebook/react/blob/a724a3b578dce77d427bef313102a4d0e978d9b4/packages/react-dom/src/client/ReactDOMComponentTree.js#L62-L64 - const rootKey = Object.keys(node).find(key => key.startsWith('__reactContainer')); - if (rootKey) - roots.push((node as any)[rootKey].stateNode.current); } // Pre-react 16: rely on `data-reactroot`