Skip to content

Commit 4a95170

Browse files
added in viewport validation (#42)
1 parent 30855f9 commit 4a95170

File tree

8 files changed

+44
-18
lines changed

8 files changed

+44
-18
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
66

77
## [0.0.19]
88
- :rocket: added to match value wait
9+
- :rocket: added in viewport validation
910

1011
## [0.0.18]
1112
- :rocket: added interceptor steps

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"homepage": "https://github.com/qavajs/steps-playwright#readme",
2525
"devDependencies": {
2626
"@cucumber/cucumber": "^9.1.0",
27-
"@qavajs/cli": "^0.0.20",
27+
"@qavajs/cli": "^0.0.21",
2828
"@qavajs/console-formatter": "^0.2.1",
2929
"@qavajs/memory": "^1.2.1",
3030
"@qavajs/po-playwright": "^0.0.8",

src/conditionWait.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import { Locator } from "playwright";
1+
import { Locator } from 'playwright';
2+
import { expect } from '@playwright/test';
3+
import {throwTimeoutError} from './utils/utils';
24

35
export const conditionValidations = {
46
PRESENT: 'present',
57
// CLICKABLE: 'clickable',
68
VISIBLE: 'visible',
79
INVISIBLE: 'invisible',
10+
IN_VIEWPORT: 'in viewport',
811
// ENABLED: 'enabled',
912
// DISABLED: 'disabled'
1013
}
@@ -34,7 +37,16 @@ const waits = {
3437
reverse: boolean,
3538
timeout: number,
3639
timeoutMsg: string
37-
) => element.waitFor({state: reverse ? 'visible' : 'hidden', timeout})
40+
) => element.waitFor({state: reverse ? 'visible' : 'hidden', timeout}),
41+
[conditionValidations.IN_VIEWPORT]: (
42+
element: Locator,
43+
reverse: boolean,
44+
timeout: number,
45+
timeoutMsg: string
46+
) => throwTimeoutError(() => expect(async () => {
47+
const e = reverse ? expect(element).not : expect(element);
48+
await e.toBeInViewport();
49+
}).toPass({ timeout }), timeoutMsg)
3850
}
3951
/**
4052
* Wait for condition

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ defineParameterType({
1616

1717
defineParameterType({
1818
name: 'playwrightConditionWait',
19-
regexp: /((not )?to (?:be )?(present|clickable|visible|invisible|enabled|disabled))/,
19+
regexp: /((not )?to (?:be )?(present|clickable|visible|invisible|enabled|disabled|in viewport))/,
2020
transformer: p => p,
2121
useForSnippets: false
2222
});

src/utils/utils.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { ScreenshotEvent } from './screenshotEvent';
2-
import { TraceEvent } from './traceEvent';
3-
import { Status, ITestStepHookParameter, ITestCaseHookParameter } from '@cucumber/cucumber';
4-
import { join } from 'path';
1+
import {ScreenshotEvent} from './screenshotEvent';
2+
import {TraceEvent} from './traceEvent';
3+
import {Status, ITestStepHookParameter, ITestCaseHookParameter} from '@cucumber/cucumber';
4+
import {join} from 'path';
55

66
export function saveScreenshotAfterStep(config: any, step: ITestStepHookParameter): boolean {
77
const isAfterStepScreenshot = equalOrIncludes(config.screenshot, ScreenshotEvent.AFTER_STEP);
@@ -45,3 +45,15 @@ export function equalOrIncludes(value: string | string[], argument: string) {
4545
? value.includes(argument)
4646
: value === argument;
4747
}
48+
49+
export async function throwTimeoutError(fn: Function, message: string) {
50+
try {
51+
await fn()
52+
} catch (err: any) {
53+
if (err.message.includes('exceeded while waiting on the predicate')) {
54+
throw new Error(message);
55+
}
56+
throw err
57+
}
58+
59+
}

src/validations.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import {Then} from '@cucumber/cucumber';
2-
import {getValue, getElement, getConditionWait} from './transformers';
3-
import {getValidation} from '@qavajs/validation';
1+
import { Then } from '@cucumber/cucumber';
2+
import { getValue, getElement, getConditionWait } from './transformers';
3+
import { getValidation } from '@qavajs/validation';
44

55
/**
66
* Verify element condition

test-e2e/features/waits.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Feature: waits
1212
| Detach Element | not to be present |
1313
| Visible Element | to be visible |
1414
| Hidden Element | to be invisible |
15+
| Visible Element | to be in viewport |
1516

1617
Scenario Outline: wait for text (<condition>)
1718
Then I wait until text of 'Loading' <condition> '<expectation>'

0 commit comments

Comments
 (0)