From caa2b732fe58f32ec03f2a9fa8568f20188203c5 Mon Sep 17 00:00:00 2001 From: Xavier Prud'homme <329744+xprudhomme@users.noreply.github.com> Date: Wed, 15 Sep 2021 13:45:59 +0200 Subject: [PATCH] fix(frame): fix Frame.waitFor's XPath pattern detection (#5184) Up to now, only strings starting with '//' are considered as to XPath selectors. Unfortunately, this is too restricting. This fix allows valid XPath selectors starting with: '/', './', and even '(//*[1])' --- src/common/FrameManager.ts | 6 ++---- test/waittask.spec.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/common/FrameManager.ts b/src/common/FrameManager.ts index 02d76a68..8c96832d 100644 --- a/src/common/FrameManager.ts +++ b/src/common/FrameManager.ts @@ -43,6 +43,7 @@ import { } from './EvalTypes.js'; const UTILITY_WORLD_NAME = '__puppeteer_utility_world__'; +const xPathPattern = /^\(\/\/[^\)]+\)|^\/\//; /** * We use symbols to prevent external parties listening to these events. @@ -1068,16 +1069,13 @@ export class Frame { options: Record = {}, ...args: SerializableOrJSHandle[] ): Promise { - const xPathPattern = '//'; - console.warn( 'waitFor is deprecated and will be removed in a future release. See https://github.com/puppeteer/puppeteer/issues/6214 for details and how to migrate your code.' ); if (helper.isString(selectorOrFunctionOrTimeout)) { const string = selectorOrFunctionOrTimeout; - if (string.startsWith(xPathPattern)) - return this.waitForXPath(string, options); + if (xPathPattern.test(string)) return this.waitForXPath(string, options); return this.waitForSelector(string, options); } if (helper.isNumber(selectorOrFunctionOrTimeout)) diff --git a/test/waittask.spec.ts b/test/waittask.spec.ts index ee76bbb6..bce546ad 100644 --- a/test/waittask.spec.ts +++ b/test/waittask.spec.ts @@ -58,6 +58,18 @@ describe('waittask specs', function () { await waitFor; expect(found).toBe(true); }); + it('should allow you to select an element with parenthesis-starting xpath', async () => { + const { page, server } = getTestState(); + let found = false; + const waitFor = page.waitFor('(//img)[200]').then(() => { + found = true; + }); + await page.goto(server.EMPTY_PAGE); + expect(found).toBe(false); + await page.goto(server.PREFIX + '/grid.html'); + await waitFor; + expect(found).toBe(true); + }); it('should not allow you to select an element with single slash xpath', async () => { const { page } = getTestState();