Skip to content

Commit f41ac5a

Browse files
authored
feat: waitForNumberOfTabs (#4124)
1 parent bf4952c commit f41ac5a

10 files changed

+115
-6
lines changed

Diff for: docs/helpers/Playwright.md

+15
Original file line numberDiff line numberDiff line change
@@ -2492,6 +2492,21 @@ See [Playwright's reference][41]
24922492

24932493
- `options` **any**
24942494

2495+
### waitForNumberOfTabs
2496+
2497+
Waits for number of tabs.
2498+
2499+
```js
2500+
I.waitForNumberOfTabs(2);
2501+
```
2502+
2503+
#### Parameters
2504+
2505+
- `expectedTabs` **[number][20]** expecting the number of tabs.
2506+
- `sec` **[number][20]** number of secs to wait.
2507+
2508+
Returns **void** automatically synchronized promise through #recorder
2509+
24952510
### waitForRequest
24962511

24972512
Waits for a network request.

Diff for: docs/helpers/Puppeteer.md

+15
Original file line numberDiff line numberDiff line change
@@ -2101,6 +2101,21 @@ See [Puppeteer's reference][23]
21012101
21022102
- `opts` **any**
21032103
2104+
### waitForNumberOfTabs
2105+
2106+
Waits for number of tabs.
2107+
2108+
```js
2109+
I.waitForNumberOfTabs(2);
2110+
```
2111+
2112+
#### Parameters
2113+
2114+
- `expectedTabs` **[number][10]** expecting the number of tabs.
2115+
- `sec` **[number][10]** number of secs to wait.
2116+
2117+
Returns **void** automatically synchronized promise through #recorder
2118+
21042119
### waitForRequest
21052120
21062121
Waits for a network request.

Diff for: docs/helpers/WebDriver.md

+15
Original file line numberDiff line numberDiff line change
@@ -2337,6 +2337,21 @@ I.waitForInvisible('#popup');
23372337
23382338
Returns **void** automatically synchronized promise through #recorder
23392339
2340+
### waitForNumberOfTabs
2341+
2342+
Waits for number of tabs.
2343+
2344+
```js
2345+
I.waitForNumberOfTabs(2);
2346+
```
2347+
2348+
#### Parameters
2349+
2350+
- `expectedTabs` **[number][22]** expecting the number of tabs.
2351+
- `sec` **[number][22]** number of secs to wait.
2352+
2353+
Returns **void** automatically synchronized promise through #recorder
2354+
23402355
### waitForText
23412356
23422357
Waits for a text to appear (by default waits for 1sec).

Diff for: docs/webapi/waitForNumberOfTabs.mustache

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Waits for number of tabs.
2+
3+
```js
4+
I.waitForNumberOfTabs(2);
5+
```
6+
7+
@param {number} expectedTabs expecting the number of tabs.
8+
@param {number} sec number of secs to wait.
9+
@returns {void} automatically synchronized promise through #recorder

Diff for: lib/helper/Playwright.js

+18
Original file line numberDiff line numberDiff line change
@@ -2584,6 +2584,24 @@ class Playwright extends Helper {
25842584
});
25852585
}
25862586

2587+
/**
2588+
* {{> waitForNumberOfTabs }}
2589+
*/
2590+
async waitForNumberOfTabs(expectedTabs, sec) {
2591+
const waitTimeout = sec ? sec * 1000 : this.options.waitForTimeout;
2592+
let currentTabs;
2593+
let count = 0;
2594+
2595+
do {
2596+
currentTabs = await this.grabNumberOfOpenTabs();
2597+
await this.wait(1);
2598+
count += 1000;
2599+
if (currentTabs >= expectedTabs) return;
2600+
} while (count <= waitTimeout);
2601+
2602+
throw new Error(`Expected ${expectedTabs} tabs are not met after ${waitTimeout / 1000} sec.`);
2603+
}
2604+
25872605
async _getContext() {
25882606
if (this.context && this.context.constructor.name === 'FrameLocator') {
25892607
return this.context;

Diff for: lib/helper/Puppeteer.js

+18
Original file line numberDiff line numberDiff line change
@@ -2151,6 +2151,24 @@ class Puppeteer extends Helper {
21512151
});
21522152
}
21532153

2154+
/**
2155+
* {{> waitForNumberOfTabs }}
2156+
*/
2157+
async waitForNumberOfTabs(expectedTabs, sec) {
2158+
const waitTimeout = sec ? sec * 1000 : this.options.waitForTimeout;
2159+
let currentTabs;
2160+
let count = 0;
2161+
2162+
do {
2163+
currentTabs = await this.grabNumberOfOpenTabs();
2164+
await this.wait(1);
2165+
count += 1000;
2166+
if (currentTabs >= expectedTabs) return;
2167+
} while (count <= waitTimeout);
2168+
2169+
throw new Error(`Expected ${expectedTabs} tabs are not met after ${waitTimeout / 1000} sec.`);
2170+
}
2171+
21542172
async _getContext() {
21552173
if (this.context && this.context.constructor.name === 'Frame') {
21562174
return this.context;

Diff for: lib/helper/WebDriver.js

+18
Original file line numberDiff line numberDiff line change
@@ -2374,6 +2374,24 @@ class WebDriver extends Helper {
23742374
return this.browser.waitUntil(async () => this.browser.execute(fn, ...args), { timeout: aSec * 1000, timeoutMsg: '' });
23752375
}
23762376

2377+
/**
2378+
* {{> waitForNumberOfTabs }}
2379+
*/
2380+
async waitForNumberOfTabs(expectedTabs, sec) {
2381+
const waitTimeout = sec ? sec * 1000 : this.options.waitForTimeoutInSeconds;
2382+
let currentTabs;
2383+
let count = 0;
2384+
2385+
do {
2386+
currentTabs = await this.grabNumberOfOpenTabs();
2387+
await this.wait(1);
2388+
count += 1000;
2389+
if (currentTabs >= expectedTabs) return;
2390+
} while (count <= waitTimeout);
2391+
2392+
throw new Error(`Expected ${expectedTabs} tabs are not met after ${waitTimeout / 1000} sec.`);
2393+
}
2394+
23772395
/**
23782396
* {{> switchTo }}
23792397
*/

Diff for: test/helper/Playwright_test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ describe('Playwright', function () {
256256
.then(() => I.dontSee('Hovered', '#show')));
257257
});
258258

259-
describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs', () => {
259+
describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs, #waitForNumberOfTabs', () => {
260260
it('should only have 1 tab open when the browser starts and navigates to the first page', () => I.amOnPage('/')
261261
.then(() => I.wait(1))
262262
.then(() => I.grabNumberOfOpenTabs())
@@ -298,13 +298,13 @@ describe('Playwright', function () {
298298

299299
it('should close other tabs', () => I.amOnPage('/')
300300
.then(() => I.openNewTab())
301-
.then(() => I.wait(1))
301+
.then(() => I.waitForNumberOfTabs(2))
302302
.then(() => I.seeInCurrentUrl('about:blank'))
303303
.then(() => I.amOnPage('/info'))
304304
.then(() => I.openNewTab())
305305
.then(() => I.amOnPage('/login'))
306306
.then(() => I.closeOtherTabs())
307-
.then(() => I.wait(1))
307+
.then(() => I.waitForNumberOfTabs(1))
308308
.then(() => I.seeInCurrentUrl('/login'))
309309
.then(() => I.grabNumberOfOpenTabs())
310310
.then(numPages => assert.equal(numPages, 1)));

Diff for: test/helper/Puppeteer_test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ describe('Puppeteer', function () {
226226
.then(() => I.dontSee('Hovered', '#show')));
227227
});
228228

229-
describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs', () => {
229+
describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs, #waitForNumberOfTabs', () => {
230230
it('should only have 1 tab open when the browser starts and navigates to the first page', () => I.amOnPage('/')
231231
.then(() => I.wait(1))
232232
.then(() => I.grabNumberOfOpenTabs())
@@ -238,7 +238,7 @@ describe('Puppeteer', function () {
238238
.then(numPages => assert.equal(numPages, 1))
239239
.then(() => I.click('New tab'))
240240
.then(() => I.switchToNextTab())
241-
.then(() => I.wait(2))
241+
.then(() => I.waitForNumberOfTabs(2))
242242
.then(() => I.seeCurrentUrlEquals('/login'))
243243
.then(() => I.grabNumberOfOpenTabs())
244244
.then(numPages => assert.equal(numPages, 2)));

Diff for: test/helper/WebDriver_test.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ describe('WebDriver', function () {
601601
});
602602
});
603603

604-
describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs', () => {
604+
describe('#switchToNextTab, #switchToPreviousTab, #openNewTab, #closeCurrentTab, #closeOtherTabs, #grabNumberOfOpenTabs, #waitForNumberOfTabs', () => {
605605
it('should only have 1 tab open when the browser starts and navigates to the first page', async () => {
606606
await wd.amOnPage('/');
607607
const numPages = await wd.grabNumberOfOpenTabs();
@@ -614,6 +614,7 @@ describe('WebDriver', function () {
614614
assert.equal(numPages, 1);
615615

616616
await wd.click('New tab');
617+
await wd.waitForNumberOfTabs(2);
617618
await wd.switchToNextTab();
618619
await wd.waitInUrl('/login');
619620
const numPagesAfter = await wd.grabNumberOfOpenTabs();

0 commit comments

Comments
 (0)