playwright-cucumber-ts-steps 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +270 -244
  2. package/dist/backend/actions/formTable.js +34 -0
  3. package/dist/backend/actions/index.js +5 -0
  4. package/dist/backend/actions/interactions.js +23 -0
  5. package/dist/backend/actions/navigation.js +19 -0
  6. package/dist/backend/api/assertions.js +26 -0
  7. package/dist/backend/api/index.js +5 -0
  8. package/dist/backend/api/mock.js +75 -0
  9. package/dist/backend/api/requests.js +86 -0
  10. package/dist/backend/api/state.js +15 -0
  11. package/dist/backend/assertions/expectVisible.js +8 -0
  12. package/dist/backend/assertions/index.js +5 -0
  13. package/dist/backend/assertions/pageState.js +25 -0
  14. package/dist/backend/assertions/text.js +20 -0
  15. package/dist/backend/assertions/visibility.js +20 -0
  16. package/dist/backend/auth/index.js +71 -0
  17. package/dist/backend/db/index.js +6 -0
  18. package/dist/backend/db/state.js +24 -0
  19. package/dist/backend/db/steps.js +43 -0
  20. package/dist/backend/elements/alerts.js +21 -0
  21. package/dist/backend/elements/forms.js +59 -0
  22. package/dist/backend/elements/frames.js +25 -0
  23. package/dist/backend/elements/index.js +5 -0
  24. package/dist/core/registry.js +20 -0
  25. package/dist/core/runner.js +151 -0
  26. package/dist/index.js +10 -0
  27. package/dist/reporting/index.js +43 -0
  28. package/package.json +19 -101
  29. package/LICENSE +0 -21
  30. package/lib/actions/clickSteps.d.ts +0 -251
  31. package/lib/actions/clickSteps.js +0 -415
  32. package/lib/actions/cookieSteps.d.ts +0 -18
  33. package/lib/actions/cookieSteps.js +0 -93
  34. package/lib/actions/debugSteps.d.ts +0 -14
  35. package/lib/actions/debugSteps.js +0 -23
  36. package/lib/actions/elementFindSteps.d.ts +0 -668
  37. package/lib/actions/elementFindSteps.js +0 -931
  38. package/lib/actions/fillFormSteps.d.ts +0 -69
  39. package/lib/actions/fillFormSteps.js +0 -237
  40. package/lib/actions/index.d.ts +0 -11
  41. package/lib/actions/index.js +0 -28
  42. package/lib/actions/inputSteps.d.ts +0 -218
  43. package/lib/actions/inputSteps.js +0 -343
  44. package/lib/actions/interceptionSteps.d.ts +0 -169
  45. package/lib/actions/interceptionSteps.js +0 -291
  46. package/lib/actions/miscSteps.d.ts +0 -645
  47. package/lib/actions/miscSteps.js +0 -1061
  48. package/lib/actions/mouseSteps.d.ts +0 -143
  49. package/lib/actions/mouseSteps.js +0 -234
  50. package/lib/actions/scrollSteps.d.ts +0 -82
  51. package/lib/actions/scrollSteps.js +0 -123
  52. package/lib/actions/storageSteps.d.ts +0 -174
  53. package/lib/actions/storageSteps.js +0 -292
  54. package/lib/assertions/buttonAndTextVisibilitySteps.d.ts +0 -245
  55. package/lib/assertions/buttonAndTextVisibilitySteps.js +0 -401
  56. package/lib/assertions/cookieSteps.d.ts +0 -75
  57. package/lib/assertions/cookieSteps.js +0 -113
  58. package/lib/assertions/elementSteps.d.ts +0 -264
  59. package/lib/assertions/elementSteps.js +0 -388
  60. package/lib/assertions/formInputSteps.d.ts +0 -248
  61. package/lib/assertions/formInputSteps.js +0 -350
  62. package/lib/assertions/index.d.ts +0 -10
  63. package/lib/assertions/index.js +0 -27
  64. package/lib/assertions/interceptionRequestsSteps.d.ts +0 -353
  65. package/lib/assertions/interceptionRequestsSteps.js +0 -593
  66. package/lib/assertions/locationSteps.d.ts +0 -217
  67. package/lib/assertions/locationSteps.js +0 -310
  68. package/lib/assertions/roleTestIdSteps.d.ts +0 -159
  69. package/lib/assertions/roleTestIdSteps.js +0 -221
  70. package/lib/assertions/semanticSteps.d.ts +0 -176
  71. package/lib/assertions/semanticSteps.js +0 -252
  72. package/lib/assertions/storageSteps.d.ts +0 -149
  73. package/lib/assertions/storageSteps.js +0 -210
  74. package/lib/assertions/visualSteps.d.ts +0 -74
  75. package/lib/assertions/visualSteps.js +0 -209
  76. package/lib/custom_setups/loginHooks.d.ts +0 -1
  77. package/lib/custom_setups/loginHooks.js +0 -130
  78. package/lib/helpers/checkPeerDeps.d.ts +0 -1
  79. package/lib/helpers/checkPeerDeps.js +0 -19
  80. package/lib/helpers/compareSnapshots.d.ts +0 -6
  81. package/lib/helpers/compareSnapshots.js +0 -20
  82. package/lib/helpers/hooks.d.ts +0 -1
  83. package/lib/helpers/hooks.js +0 -210
  84. package/lib/helpers/utils/fakerUtils.d.ts +0 -1
  85. package/lib/helpers/utils/fakerUtils.js +0 -60
  86. package/lib/helpers/utils/index.d.ts +0 -4
  87. package/lib/helpers/utils/index.js +0 -20
  88. package/lib/helpers/utils/optionsUtils.d.ts +0 -24
  89. package/lib/helpers/utils/optionsUtils.js +0 -88
  90. package/lib/helpers/utils/resolveUtils.d.ts +0 -6
  91. package/lib/helpers/utils/resolveUtils.js +0 -72
  92. package/lib/helpers/utils/sessionUtils.d.ts +0 -3
  93. package/lib/helpers/utils/sessionUtils.js +0 -40
  94. package/lib/helpers/world.d.ts +0 -34
  95. package/lib/helpers/world.js +0 -110
  96. package/lib/iframes/frames.d.ts +0 -1
  97. package/lib/iframes/frames.js +0 -11
  98. package/lib/index.d.ts +0 -10
  99. package/lib/index.js +0 -28
  100. package/lib/register.d.ts +0 -1
  101. package/lib/register.js +0 -6
  102. package/src/actions/clickSteps.ts +0 -429
  103. package/src/actions/cookieSteps.ts +0 -95
  104. package/src/actions/debugSteps.ts +0 -21
  105. package/src/actions/elementFindSteps.ts +0 -961
  106. package/src/actions/fillFormSteps.ts +0 -270
  107. package/src/actions/index.ts +0 -12
  108. package/src/actions/inputSteps.ts +0 -354
  109. package/src/actions/interceptionSteps.ts +0 -325
  110. package/src/actions/miscSteps.ts +0 -1144
  111. package/src/actions/mouseSteps.ts +0 -256
  112. package/src/actions/scrollSteps.ts +0 -122
  113. package/src/actions/storageSteps.ts +0 -308
  114. package/src/assertions/buttonAndTextVisibilitySteps.ts +0 -436
  115. package/src/assertions/cookieSteps.ts +0 -131
  116. package/src/assertions/elementSteps.ts +0 -432
  117. package/src/assertions/formInputSteps.ts +0 -377
  118. package/src/assertions/index.ts +0 -11
  119. package/src/assertions/interceptionRequestsSteps.ts +0 -640
  120. package/src/assertions/locationSteps.ts +0 -315
  121. package/src/assertions/roleTestIdSteps.ts +0 -254
  122. package/src/assertions/semanticSteps.ts +0 -267
  123. package/src/assertions/storageSteps.ts +0 -250
  124. package/src/assertions/visualSteps.ts +0 -275
  125. package/src/custom_setups/loginHooks.ts +0 -154
  126. package/src/helpers/checkPeerDeps.ts +0 -19
  127. package/src/helpers/compareSnapshots.ts +0 -35
  128. package/src/helpers/hooks.ts +0 -212
  129. package/src/helpers/utils/fakerUtils.ts +0 -64
  130. package/src/helpers/utils/index.ts +0 -4
  131. package/src/helpers/utils/optionsUtils.ts +0 -104
  132. package/src/helpers/utils/resolveUtils.ts +0 -74
  133. package/src/helpers/utils/sessionUtils.ts +0 -36
  134. package/src/helpers/world.ts +0 -119
  135. package/src/iframes/frames.ts +0 -15
  136. package/src/index.ts +0 -18
  137. package/src/register.ts +0 -4
@@ -1,72 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.resolveValue = resolveValue;
7
- exports.resolveLoginValue = resolveLoginValue;
8
- exports.deriveSessionName = deriveSessionName;
9
- exports.resolveSessionPath = resolveSessionPath;
10
- exports.normalizeDeviceName = normalizeDeviceName;
11
- // src/helpers/utils/resolveUtils.ts
12
- const fs_1 = __importDefault(require("fs"));
13
- const path_1 = __importDefault(require("path"));
14
- const test_1 = require("@playwright/test");
15
- // Dynamic resolver
16
- function resolveValue(input) {
17
- // Uppercase = environment variable (e.g. TEST_USER)
18
- if (/^[A-Z0-9_]+$/.test(input)) {
19
- const envVal = process.env[input];
20
- if (!envVal) {
21
- throw new Error(`Environment variable ${input} not found.`);
22
- }
23
- return envVal;
24
- }
25
- // Dot = JSON reference (e.g. userData.email)
26
- if (input.includes(".")) {
27
- const [fileName, fieldName] = input.split(".");
28
- const jsonPath = path_1.default.resolve("e2e/support/helper/test-data", `${fileName}.json`);
29
- if (fs_1.default.existsSync(jsonPath)) {
30
- const json = JSON.parse(fs_1.default.readFileSync(jsonPath, "utf-8"));
31
- const value = json[fieldName];
32
- if (value !== undefined)
33
- return value;
34
- throw new Error(`Field "${fieldName}" not found in ${fileName}.json`);
35
- }
36
- }
37
- // Default to hardcoded value
38
- return input;
39
- }
40
- function resolveLoginValue(raw, world) {
41
- // ✅ Alias: @aliasName
42
- if (raw.startsWith("@")) {
43
- return world.data[raw.slice(1)];
44
- }
45
- // ✅ JSON: user.json:key
46
- if (raw.includes(".json:")) {
47
- const [filename, key] = raw.split(".json:");
48
- const filePath = path_1.default.resolve("test-data", `${filename}.json`);
49
- if (!fs_1.default.existsSync(filePath)) {
50
- throw new Error(`JSON fixture not found: ${filename}.json`);
51
- }
52
- const fileData = JSON.parse(fs_1.default.readFileSync(filePath, "utf-8"));
53
- return fileData[key];
54
- }
55
- // ✅ Fallback to raw value
56
- return raw;
57
- }
58
- // Determine session name from email or username
59
- function deriveSessionName(emailOrUser, fallback = "default") {
60
- if (!emailOrUser)
61
- return `${fallback}User`;
62
- const base = emailOrUser.includes("@") ? emailOrUser.split("@")[0] : emailOrUser;
63
- return `${base}User`;
64
- }
65
- function resolveSessionPath(world, name) {
66
- const dir = path_1.default.resolve(world.data.artifactDir || "test-artifacts", "auth-cookies");
67
- fs_1.default.mkdirSync(dir, { recursive: true });
68
- return path_1.default.resolve(dir, name.endsWith(".json") ? name : `${name}.json`);
69
- }
70
- function normalizeDeviceName(name) {
71
- return (Object.keys(test_1.devices).find((device) => device.toLowerCase().replace(/\s+/g, "") === name.toLowerCase().replace(/[-_\s]+/g, "")) || "");
72
- }
@@ -1,3 +0,0 @@
1
- import { BrowserContext } from "playwright";
2
- export declare function injectStorage(world: any, type: string, key: string, value: string): Promise<void>;
3
- export declare function saveSessionData(context: BrowserContext, file: string): Promise<void>;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.injectStorage = injectStorage;
7
- exports.saveSessionData = saveSessionData;
8
- //sessionUtils.ts
9
- const fs_1 = __importDefault(require("fs"));
10
- const path_1 = __importDefault(require("path"));
11
- async function injectStorage(world, type, key, value) {
12
- const page = world.page;
13
- if (type === "localStorage") {
14
- await page.evaluate(([k, v]) => localStorage.setItem(k, v), [key, value]);
15
- }
16
- else if (type === "sessionStorage") {
17
- await page.evaluate(([k, v]) => sessionStorage.setItem(k, v), [key, value]);
18
- }
19
- else if (type === "cookie") {
20
- await page.context.addCookies([
21
- {
22
- name: key,
23
- value,
24
- domain: new URL(page.url()).hostname,
25
- path: "/",
26
- httpOnly: false,
27
- secure: true,
28
- sameSite: "Lax",
29
- },
30
- ]);
31
- }
32
- }
33
- async function saveSessionData(context, file) {
34
- const storageState = await context.storageState();
35
- const outDir = "test-artifacts/auth-cookies";
36
- const outPath = path_1.default.resolve(outDir, file);
37
- fs_1.default.mkdirSync(outDir, { recursive: true });
38
- fs_1.default.writeFileSync(outPath, JSON.stringify(storageState, null, 2));
39
- console.log(`💾 Saved session to ${outPath}`);
40
- }
@@ -1,34 +0,0 @@
1
- import { World, ITestCaseHookParameter } from "@cucumber/cucumber";
2
- import { Browser, Page, BrowserContext, Locator, FrameLocator } from "@playwright/test";
3
- export interface TestConfig {
4
- enableScreenshots: boolean;
5
- enableVisualTest: boolean;
6
- artifactDir: string;
7
- }
8
- export declare class CustomWorld extends World {
9
- browser: Browser;
10
- context: BrowserContext;
11
- page: Page;
12
- elements?: Locator;
13
- element?: Locator;
14
- frame?: FrameLocator;
15
- currentLocator?: Locator;
16
- data: Record<string, any>;
17
- logs: string[];
18
- testName?: string;
19
- fakeTimersActive: boolean;
20
- config: TestConfig;
21
- constructor(options: import("@cucumber/cucumber").IWorldOptions);
22
- init(testInfo?: ITestCaseHookParameter): Promise<void>;
23
- /**
24
- * Returns the current interaction scope: either the main page or active frame.
25
- */
26
- getScope(): Page | FrameLocator;
27
- /**
28
- * Returns a Locator scoped to the current iframe or page.
29
- */
30
- getLocator(selector: string): Locator;
31
- exitIframe(): void;
32
- log: (message: string) => void;
33
- cleanup(testInfo?: ITestCaseHookParameter): Promise<void>;
34
- }
@@ -1,110 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.CustomWorld = void 0;
37
- const cucumber_1 = require("@cucumber/cucumber");
38
- const test_1 = require("@playwright/test");
39
- const dotenv = __importStar(require("dotenv"));
40
- const playwright_1 = require("playwright");
41
- dotenv.config();
42
- const isHeadless = process.env.HEADLESS !== "false";
43
- const slowMo = process.env.SLOWMO ? Number(process.env.SLOWMO) : 0;
44
- class CustomWorld extends cucumber_1.World {
45
- constructor(options) {
46
- super(options);
47
- this.data = {};
48
- this.logs = [];
49
- this.config = {
50
- enableScreenshots: true,
51
- enableVisualTest: false,
52
- artifactDir: "test-artifacts",
53
- };
54
- this.log = (message) => {
55
- this.logs.push(message);
56
- console.log(`[LOG] ${message}`);
57
- };
58
- this.fakeTimersActive = false;
59
- }
60
- async init(testInfo) {
61
- const info = testInfo ?? this.parameters?.testInfo;
62
- const isMobile = info?.pickle.tags.some((tag) => tag.name === "@mobile");
63
- const device = isMobile ? test_1.devices["Pixel 5"] : undefined;
64
- this.browser = await playwright_1.chromium.launch({ headless: isHeadless, slowMo });
65
- this.context = await this.browser.newContext({
66
- ...(device || {}),
67
- recordVideo: { dir: `${this.config.artifactDir}/videos` },
68
- });
69
- // Important: Initialize clock mocking *before* navigating or interacting with the page
70
- // if you intend to use page.clock. This typically involves addInitScript.
71
- // However, the context.clock API does not usually require an init script for its methods.
72
- // If you explicitly loaded a mocking library, you'd do it here.
73
- // For just context.clock methods, they should be available.
74
- this.page = await this.context.newPage();
75
- this.testName = info?.pickle.name;
76
- this.log(`🧪 Initialized context${isMobile ? " (mobile)" : ""}`);
77
- }
78
- /**
79
- * Returns the current interaction scope: either the main page or active frame.
80
- */
81
- getScope() {
82
- return this.frame ?? this.page;
83
- }
84
- /**
85
- * Returns a Locator scoped to the current iframe or page.
86
- */
87
- getLocator(selector) {
88
- return this.getScope().locator(selector);
89
- }
90
- exitIframe() {
91
- this.frame = undefined;
92
- this.log("⬅️ Exited iframe, scope is now main page");
93
- }
94
- async cleanup(testInfo) {
95
- try {
96
- await this.page?.close();
97
- }
98
- catch (err) {
99
- this.log(`⚠️ Error closing page: ${err.message}`);
100
- }
101
- try {
102
- await this.context?.close();
103
- }
104
- catch (err) {
105
- this.log(`⚠️ Error closing context: ${err.message}`);
106
- }
107
- }
108
- }
109
- exports.CustomWorld = CustomWorld;
110
- (0, cucumber_1.setWorldConstructor)(CustomWorld);
@@ -1 +0,0 @@
1
- export {};
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const cucumber_1 = require("@cucumber/cucumber");
4
- (0, cucumber_1.When)("I find href in iframe {string} and store as {string}", async function (iframeSelector, key) {
5
- const iframe = this.page.frameLocator(iframeSelector);
6
- const link = await iframe.locator("a[href]").first();
7
- const href = await link.getAttribute("href");
8
- if (!href)
9
- throw new Error("No link found in iframe.");
10
- this.data[key] = href;
11
- });
package/lib/index.d.ts DELETED
@@ -1,10 +0,0 @@
1
- export * from "./iframes/frames";
2
- export * from "./custom_setups/loginHooks";
3
- export * from "./helpers/compareSnapshots";
4
- export * from "./helpers/hooks";
5
- export * from "./helpers/utils";
6
- export * from "./helpers/world";
7
- export type { CustomWorld } from "./helpers/world";
8
- export * from "./actions";
9
- export * from "./assertions";
10
- export * from "./custom_setups/loginHooks";
package/lib/index.js DELETED
@@ -1,28 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- // Iframes
18
- __exportStar(require("./iframes/frames"), exports);
19
- // Setup (custom hooks, login, etc.)
20
- __exportStar(require("./custom_setups/loginHooks"), exports);
21
- // Core helpers and utilities
22
- __exportStar(require("./helpers/compareSnapshots"), exports);
23
- __exportStar(require("./helpers/hooks"), exports);
24
- __exportStar(require("./helpers/utils"), exports);
25
- __exportStar(require("./helpers/world"), exports);
26
- __exportStar(require("./actions"), exports);
27
- __exportStar(require("./assertions"), exports);
28
- __exportStar(require("./custom_setups/loginHooks"), exports);
package/lib/register.d.ts DELETED
@@ -1 +0,0 @@
1
- import "./index";
package/lib/register.js DELETED
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // src/register.ts
4
- const checkPeerDeps_1 = require("./helpers/checkPeerDeps");
5
- (0, checkPeerDeps_1.checkPeerDependencies)(["@cucumber/cucumber", "@playwright/test", "@faker-js/faker"]);
6
- require("./index");