Skip to content

Commit f311d08

Browse files
authored
Add "I wait for network idle for {int} ms" step (#128)
1 parent 4bb7e39 commit f311d08

File tree

10 files changed

+91
-9
lines changed

10 files changed

+91
-9
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
1010
:pencil: - chore
1111
:microscope: - experimental
1212

13+
## [0.52.0]
14+
- :rocket: added _I wait for network idle {playwrightTimeout}_ step
15+
1316
## [0.51.0]
1417
Breaking change:
1518
- :rocket: include page objects into step bundle

package-lock.json

Lines changed: 12 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@qavajs/steps-playwright",
3-
"version": "0.51.0",
3+
"version": "0.52.0",
44
"description": "steps to interact with playwright",
55
"main": "./index.js",
66
"scripts": {
@@ -41,7 +41,8 @@
4141
"ts-node": "^10.9.2",
4242
"typescript": "^5.5.4",
4343
"vitest": "^2.0.5",
44-
"@qavajs/validation": "^0.10.0"
44+
"@qavajs/validation": "^0.10.0",
45+
"@qavajs/steps-memory": "^0.17.0"
4546
},
4647
"dependencies": {
4748
"@playwright/test": "^1.46.0",

src/IQavajsPlaywrightConfig.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ export interface IQavajsPlaywrightConfig {
3535
* }
3636
*/
3737
page?: number,
38+
/**
39+
* Network inactivity timeout
40+
*
41+
* default: 500
42+
* @example
43+
* export default {
44+
* networkIdle: 2_000
45+
* }
46+
*/
47+
networkIdle?: number,
3848
/**
3949
* Element value timeout
4050
*

src/waits.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,35 @@ When(
363363
});
364364
}
365365
);
366+
367+
/**
368+
* Wait for absence of network activity during specified period of time
369+
* @param {number} timeout - wait condition
370+
* @example I wait for network idle for 1000 ms
371+
*/
372+
When('I wait for network idle {playwrightTimeout}', async function (timeoutValue: number | null) {
373+
const timeout = timeoutValue ?? config.browser.timeout.networkIdle ?? 500
374+
return new Promise((resolve) => {
375+
let timerId: any = setTimeout(() => {
376+
cleanupAndResolve();
377+
}, timeout);
378+
379+
const resetTimer = () => {
380+
clearTimeout(timerId);
381+
timerId = setTimeout(() => {
382+
cleanupAndResolve();
383+
}, timeout);
384+
};
385+
386+
page.on('request', resetTimer);
387+
page.on('requestfinished', resetTimer);
388+
page.on('requestfailed', resetTimer);
389+
390+
const cleanupAndResolve = () => {
391+
page.removeListener('request', resetTimer);
392+
page.removeListener('requestfinished', resetTimer);
393+
page.removeListener('requestfailed', resetTimer);
394+
resolve(0);
395+
};
396+
});
397+
})

test-e2e/apps/waits.html

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
<title>Title</title>
66
</head>
77
<body>
8+
<button id="fetchButton">Fetch</button>
9+
<div id="fetchResult">undefined</div>
810
<button id="enabledButton">Enabled Button</button>
911
<button id="disabledButton" disabled>Disabled Button</button>
1012
<div id="containerPresent"></div>
@@ -38,16 +40,22 @@
3840
<script>
3941
let counter = 0;
4042
const timeout = 1700;
43+
const fetchButton = document.querySelector('#fetchButton');
44+
const fetchResult = document.querySelector('#fetchResult');
4145
const containerPresent = document.querySelector('#containerPresent');
4246
const randomTextDiv = document.querySelector('#randomText');
4347
const randomBoolean = Date.now() % 2 === 0;
4448
const text = randomBoolean ? 'You are lucky' : 'Not this time';
4549
const flipCoin = document.querySelector('#flipCoin');
4650
const coin = document.querySelector('#coin');
47-
const pseudoRandomCoin = ['Tails', 'Tails', 'Heads']
51+
const pseudoRandomCoin = ['Tails', 'Tails', 'Heads'];
4852
const plusButton = document.querySelector('#plusButton');
4953
const digitInput = document.querySelector('#digitInput');
5054

55+
fetchButton.addEventListener('click', function () {
56+
fetch('https://jsonplaceholder.typicode.com/comments').then(() => setTimeout(() => fetchResult.innerText = 'data received', 2000));
57+
});
58+
5159
randomTextDiv.innerText = text;
5260
if (randomBoolean) {
5361
const button = document.querySelector('#isDisabledButton');

test-e2e/features/waits.feature

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,10 @@ Feature: waits
115115

116116
Scenario: click until value
117117
Then I click 'Plus Button' until value of 'Digit Input' to equal '4'
118+
119+
Scenario: wait for network idle
120+
When I set 2000 ms delayed mock for '**/comments' request
121+
And I click 'Fetch Button'
122+
And I wait for network idle (timeout: 2200)
123+
And I save text of 'Fetch Result' as 'text'
124+
Then I expect '$text' to equal 'data received'

test-e2e/page_object/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ export default class App {
5858
Coin = $('#coin');
5959
DigitInput = $('#digitInput');
6060
PlusButton = $('#plusButton');
61+
FetchButton = $('#fetchButton');
62+
FetchResult = $('#fetchResult');
6163

6264
// Electron
6365
OpenNewWindowElectronButton = $('#electronButton');

test-e2e/step-definitions/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { Then } from '@cucumber/cucumber';
22
import memory from '@qavajs/memory';
33
import { Page, expect } from '@playwright/test';
4+
import {getElement} from "../../src/transformers";
5+
import {getValidation} from "@qavajs/validation";
46

57
declare global {
68
var page: Page;
@@ -29,3 +31,13 @@ Then('I expect viewport size to equal {string}', async function (expectedSize) {
2931
const actualValue = page.viewportSize();
3032
expect(actualValue).toEqual(expectedValue);
3133
})
34+
35+
Then('I set {int} ms delayed mock for {string} request', async function (delay: number, glob: string) {
36+
await page.route(glob, async (route) => {
37+
setTimeout(async () => await route.fulfill({
38+
status: 200,
39+
contentType: 'text/plain',
40+
body: 'Everything is okay'
41+
}), delay);
42+
});
43+
})

test-e2e/webui.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const common = {
66
paths: ['test-e2e/features/*.feature'],
77
require: [
88
'test-e2e/step-definitions/*.ts',
9+
'node_modules/@qavajs/steps-memory/index.js',
910
'src/*.ts',
1011
],
1112
browser: {

0 commit comments

Comments
 (0)