From 43fa71b3e3b0f1fdd7518b49b88425038782e99b Mon Sep 17 00:00:00 2001 From: kobenguyent Date: Wed, 10 Jan 2024 17:33:00 +0100 Subject: [PATCH] feat: waitForNumberOfTabs --- docs/helpers/Playwright.md | 15 +++++++++++++++ docs/helpers/Puppeteer.md | 15 +++++++++++++++ docs/helpers/WebDriver.md | 15 +++++++++++++++ docs/webapi/waitForNumberOfTabs.mustache | 9 +++++++++ lib/helper/Playwright.js | 18 ++++++++++++++++++ lib/helper/Puppeteer.js | 18 ++++++++++++++++++ lib/helper/WebDriver.js | 18 ++++++++++++++++++ test/helper/Playwright_test.js | 6 +++--- test/helper/Puppeteer_test.js | 4 ++-- test/helper/WebDriver_test.js | 3 ++- 10 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 docs/webapi/waitForNumberOfTabs.mustache diff --git a/docs/helpers/Playwright.md b/docs/helpers/Playwright.md index 73d6b1384..326b41c24 100644 --- a/docs/helpers/Playwright.md +++ b/docs/helpers/Playwright.md @@ -2492,6 +2492,21 @@ See [Playwright's reference][41] - `options` **any** +### waitForNumberOfTabs + +Waits for number of tabs. + +```js +I.waitForNumberOfTabs(2); +``` + +#### Parameters + +- `expectedTabs` **[number][20]** expecting the number of tabs. +- `sec` **[number][20]** number of secs to wait. + +Returns **void** automatically synchronized promise through #recorder + ### waitForRequest Waits for a network request. diff --git a/docs/helpers/Puppeteer.md b/docs/helpers/Puppeteer.md index 5f86202a8..14e9630c4 100644 --- a/docs/helpers/Puppeteer.md +++ b/docs/helpers/Puppeteer.md @@ -2101,6 +2101,21 @@ See [Puppeteer's reference][23] - `opts` **any** +### waitForNumberOfTabs + +Waits for number of tabs. + +```js +I.waitForNumberOfTabs(2); +``` + +#### Parameters + +- `expectedTabs` **[number][10]** expecting the number of tabs. +- `sec` **[number][10]** number of secs to wait. + +Returns **void** automatically synchronized promise through #recorder + ### waitForRequest Waits for a network request. diff --git a/docs/helpers/WebDriver.md b/docs/helpers/WebDriver.md index 1570f6f89..0888157d2 100644 --- a/docs/helpers/WebDriver.md +++ b/docs/helpers/WebDriver.md @@ -2288,6 +2288,21 @@ I.waitForInvisible('#popup'); Returns **void** automatically synchronized promise through #recorder +### waitForNumberOfTabs + +Waits for number of tabs. + +```js +I.waitForNumberOfTabs(2); +``` + +#### Parameters + +- `expectedTabs` **[number][22]** expecting the number of tabs. +- `sec` **[number][22]** number of secs to wait. + +Returns **void** automatically synchronized promise through #recorder + ### waitForText Waits for a text to appear (by default waits for 1sec). diff --git a/docs/webapi/waitForNumberOfTabs.mustache b/docs/webapi/waitForNumberOfTabs.mustache new file mode 100644 index 000000000..68b5035df --- /dev/null +++ b/docs/webapi/waitForNumberOfTabs.mustache @@ -0,0 +1,9 @@ +Waits for number of tabs. + +```js +I.waitForNumberOfTabs(2); +``` + +@param {number} expectedTabs expecting the number of tabs. +@param {number} sec number of secs to wait. +@returns {void} automatically synchronized promise through #recorder diff --git a/lib/helper/Playwright.js b/lib/helper/Playwright.js index 390c1b172..0b6db378a 100644 --- a/lib/helper/Playwright.js +++ b/lib/helper/Playwright.js @@ -2583,6 +2583,24 @@ class Playwright extends Helper { }); } + /** + * {{> waitForNumberOfTabs }} + */ + async waitForNumberOfTabs(expectedTabs, sec) { + const waitTimeout = sec ? sec * 1000 : this.options.waitForTimeout; + let currentTabs; + let count = 0; + + do { + currentTabs = await this.grabNumberOfOpenTabs(); + await this.wait(1); + count += 1000; + if (currentTabs >= expectedTabs) return; + } while (count <= waitTimeout); + + throw new Error(`Expected ${expectedTabs} tabs are not met after ${waitTimeout / 1000} sec.`); + } + async _getContext() { if (this.context && this.context.constructor.name === 'FrameLocator') { return this.context; diff --git a/lib/helper/Puppeteer.js b/lib/helper/Puppeteer.js index 061e1bae6..bbc187acb 100644 --- a/lib/helper/Puppeteer.js +++ b/lib/helper/Puppeteer.js @@ -2151,6 +2151,24 @@ class Puppeteer extends Helper { }); } + /** + * {{> waitForNumberOfTabs }} + */ + async waitForNumberOfTabs(expectedTabs, sec) { + const waitTimeout = sec ? sec * 1000 : this.options.waitForTimeout; + let currentTabs; + let count = 0; + + do { + currentTabs = await this.grabNumberOfOpenTabs(); + await this.wait(1); + count += 1000; + if (currentTabs >= expectedTabs) return; + } while (count <= waitTimeout); + + throw new Error(`Expected ${expectedTabs} tabs are not met after ${waitTimeout / 1000} sec.`); + } + async _getContext() { if (this.context && this.context.constructor.name === 'Frame') { return this.context; diff --git a/lib/helper/WebDriver.js b/lib/helper/WebDriver.js index 6fa263b02..4b92c3f14 100644 --- a/lib/helper/WebDriver.js +++ b/lib/helper/WebDriver.js @@ -2306,6 +2306,24 @@ class WebDriver extends Helper { return this.browser.waitUntil(async () => this.browser.execute(fn, ...args), { timeout: aSec * 1000, timeoutMsg: '' }); } + /** + * {{> waitForNumberOfTabs }} + */ + async waitForNumberOfTabs(expectedTabs, sec) { + const waitTimeout = sec ? sec * 1000 : this.options.waitForTimeoutInSeconds; + let currentTabs; + let count = 0; + + do { + currentTabs = await this.grabNumberOfOpenTabs(); + await this.wait(1); + count += 1000; + if (currentTabs >= expectedTabs) return; + } while (count <= waitTimeout); + + throw new Error(`Expected ${expectedTabs} tabs are not met after ${waitTimeout / 1000} sec.`); + } + /** * {{> switchTo }} */ diff --git a/test/helper/Playwright_test.js b/test/helper/Playwright_test.js index 3ed3cdc89..ce4d0e1f4 100644 --- a/test/helper/Playwright_test.js +++ b/test/helper/Playwright_test.js @@ -256,7 +256,7 @@ describe('Playwright', function () { .then(() => I.dontSee('Hovered', '#show'))); }); - describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs', () => { + describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs, #waitForNumberOfTabs', () => { it('should only have 1 tab open when the browser starts and navigates to the first page', () => I.amOnPage('/') .then(() => I.wait(1)) .then(() => I.grabNumberOfOpenTabs()) @@ -298,13 +298,13 @@ describe('Playwright', function () { it('should close other tabs', () => I.amOnPage('/') .then(() => I.openNewTab()) - .then(() => I.wait(1)) + .then(() => I.waitForNumberOfTabs(2)) .then(() => I.seeInCurrentUrl('about:blank')) .then(() => I.amOnPage('/info')) .then(() => I.openNewTab()) .then(() => I.amOnPage('/login')) .then(() => I.closeOtherTabs()) - .then(() => I.wait(1)) + .then(() => I.waitForNumberOfTabs(1)) .then(() => I.seeInCurrentUrl('/login')) .then(() => I.grabNumberOfOpenTabs()) .then(numPages => assert.equal(numPages, 1))); diff --git a/test/helper/Puppeteer_test.js b/test/helper/Puppeteer_test.js index 7623f9536..75532a3c2 100644 --- a/test/helper/Puppeteer_test.js +++ b/test/helper/Puppeteer_test.js @@ -226,7 +226,7 @@ describe('Puppeteer', function () { .then(() => I.dontSee('Hovered', '#show'))); }); - describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs', () => { + describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs, #waitForNumberOfTabs', () => { it('should only have 1 tab open when the browser starts and navigates to the first page', () => I.amOnPage('/') .then(() => I.wait(1)) .then(() => I.grabNumberOfOpenTabs()) @@ -238,7 +238,7 @@ describe('Puppeteer', function () { .then(numPages => assert.equal(numPages, 1)) .then(() => I.click('New tab')) .then(() => I.switchToNextTab()) - .then(() => I.wait(2)) + .then(() => I.waitForNumberOfTabs(2)) .then(() => I.seeCurrentUrlEquals('/login')) .then(() => I.grabNumberOfOpenTabs()) .then(numPages => assert.equal(numPages, 2))); diff --git a/test/helper/WebDriver_test.js b/test/helper/WebDriver_test.js index d374aa939..324bb30b7 100644 --- a/test/helper/WebDriver_test.js +++ b/test/helper/WebDriver_test.js @@ -601,7 +601,7 @@ describe('WebDriver', function () { }); }); - describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs', () => { + describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs, #waitForNumberOfTabs', () => { it('should only have 1 tab open when the browser starts and navigates to the first page', async () => { await wd.amOnPage('/'); const numPages = await wd.grabNumberOfOpenTabs(); @@ -614,6 +614,7 @@ describe('WebDriver', function () { assert.equal(numPages, 1); await wd.click('New tab'); + await wd.waitForNumberOfTabs(2); await wd.switchToNextTab(); await wd.waitInUrl('/login'); const numPagesAfter = await wd.grabNumberOfOpenTabs();