playwright-mimic 0.1.0 → 0.1.1

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 (110) hide show
  1. package/README.md +633 -446
  2. package/dist/agentic/agent.d.ts +106 -0
  3. package/dist/agentic/agent.d.ts.map +1 -0
  4. package/dist/agentic/agent.js +528 -0
  5. package/dist/agentic/agent.js.map +1 -0
  6. package/dist/agentic/index.d.ts +13 -0
  7. package/dist/agentic/index.d.ts.map +1 -0
  8. package/dist/agentic/index.js +12 -0
  9. package/dist/agentic/index.js.map +1 -0
  10. package/dist/agentic/planner.d.ts +41 -0
  11. package/dist/agentic/planner.d.ts.map +1 -0
  12. package/dist/agentic/planner.js +136 -0
  13. package/dist/agentic/planner.js.map +1 -0
  14. package/dist/agentic/react.d.ts +35 -0
  15. package/dist/agentic/react.d.ts.map +1 -0
  16. package/dist/agentic/react.js +170 -0
  17. package/dist/agentic/react.js.map +1 -0
  18. package/dist/agentic/recovery.d.ts +55 -0
  19. package/dist/agentic/recovery.d.ts.map +1 -0
  20. package/dist/agentic/recovery.js +200 -0
  21. package/dist/agentic/recovery.js.map +1 -0
  22. package/dist/agentic/reflection.d.ts +40 -0
  23. package/dist/agentic/reflection.d.ts.map +1 -0
  24. package/dist/agentic/reflection.js +142 -0
  25. package/dist/agentic/reflection.js.map +1 -0
  26. package/dist/agentic/types.d.ts +177 -0
  27. package/dist/agentic/types.d.ts.map +1 -0
  28. package/dist/agentic/types.js +8 -0
  29. package/dist/agentic/types.js.map +1 -0
  30. package/dist/agentic/wait.d.ts +50 -0
  31. package/dist/agentic/wait.d.ts.map +1 -0
  32. package/dist/agentic/wait.js +140 -0
  33. package/dist/agentic/wait.js.map +1 -0
  34. package/dist/agentic-mimic.d.ts +56 -0
  35. package/dist/agentic-mimic.d.ts.map +1 -0
  36. package/dist/agentic-mimic.js +98 -0
  37. package/dist/agentic-mimic.js.map +1 -0
  38. package/dist/index.d.ts +11 -8
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +12 -9
  41. package/dist/index.js.map +1 -1
  42. package/dist/mimic/actionType.d.ts +7 -0
  43. package/dist/mimic/actionType.d.ts.map +1 -0
  44. package/dist/mimic/actionType.js +44 -0
  45. package/dist/mimic/actionType.js.map +1 -0
  46. package/dist/mimic/annotations.d.ts +20 -0
  47. package/dist/mimic/annotations.d.ts.map +1 -0
  48. package/dist/mimic/annotations.js +30 -0
  49. package/dist/mimic/annotations.js.map +1 -0
  50. package/dist/mimic/cli.d.ts +15 -0
  51. package/dist/mimic/cli.d.ts.map +1 -0
  52. package/dist/mimic/cli.js +17 -0
  53. package/dist/mimic/cli.js.map +1 -0
  54. package/dist/mimic/click.d.ts +39 -0
  55. package/dist/mimic/click.d.ts.map +1 -0
  56. package/dist/mimic/click.js +233 -0
  57. package/dist/mimic/click.js.map +1 -0
  58. package/dist/mimic/forms.d.ts +47 -0
  59. package/dist/mimic/forms.d.ts.map +1 -0
  60. package/dist/mimic/forms.js +264 -0
  61. package/dist/mimic/forms.js.map +1 -0
  62. package/dist/mimic/navigation.d.ts +19 -0
  63. package/dist/mimic/navigation.d.ts.map +1 -0
  64. package/dist/mimic/navigation.js +117 -0
  65. package/dist/mimic/navigation.js.map +1 -0
  66. package/dist/mimic/replay.d.ts +21 -0
  67. package/dist/mimic/replay.d.ts.map +1 -0
  68. package/dist/mimic/replay.js +133 -0
  69. package/dist/mimic/replay.js.map +1 -0
  70. package/dist/mimic/schema/action.d.ts +315 -0
  71. package/dist/mimic/schema/action.d.ts.map +1 -0
  72. package/dist/mimic/schema/action.js +204 -0
  73. package/dist/mimic/schema/action.js.map +1 -0
  74. package/dist/mimic/selector.d.ts +139 -0
  75. package/dist/mimic/selector.d.ts.map +1 -0
  76. package/dist/mimic/selector.js +1103 -0
  77. package/dist/mimic/selector.js.map +1 -0
  78. package/dist/mimic/selectorDescriptor.d.ts +13 -0
  79. package/dist/mimic/selectorDescriptor.d.ts.map +1 -0
  80. package/dist/mimic/selectorDescriptor.js +9 -0
  81. package/dist/mimic/selectorDescriptor.js.map +1 -0
  82. package/dist/mimic/selectorSerialization.d.ts +30 -0
  83. package/dist/mimic/selectorSerialization.d.ts.map +1 -0
  84. package/dist/mimic/selectorSerialization.js +170 -0
  85. package/dist/mimic/selectorSerialization.js.map +1 -0
  86. package/dist/mimic/selectorTypes.d.ts +200 -0
  87. package/dist/mimic/selectorTypes.d.ts.map +1 -0
  88. package/dist/mimic/selectorTypes.js +2 -0
  89. package/dist/mimic/selectorTypes.js.map +1 -0
  90. package/dist/mimic/selectorUtils.d.ts +26 -0
  91. package/dist/mimic/selectorUtils.d.ts.map +1 -0
  92. package/dist/mimic/selectorUtils.js +144 -0
  93. package/dist/mimic/selectorUtils.js.map +1 -0
  94. package/dist/mimic/storage.d.ts +75 -0
  95. package/dist/mimic/storage.d.ts.map +1 -0
  96. package/dist/mimic/storage.js +197 -0
  97. package/dist/mimic/storage.js.map +1 -0
  98. package/dist/mimic/types.d.ts +63 -0
  99. package/dist/mimic/types.d.ts.map +1 -0
  100. package/dist/mimic/types.js +7 -0
  101. package/dist/mimic/types.js.map +1 -0
  102. package/dist/mimic.d.ts +28 -4
  103. package/dist/mimic.d.ts.map +1 -1
  104. package/dist/mimic.js +374 -32
  105. package/dist/mimic.js.map +1 -1
  106. package/dist/mimicry.d.ts +4 -4
  107. package/dist/mimicry.d.ts.map +1 -1
  108. package/dist/mimicry.js +22 -13
  109. package/dist/mimicry.js.map +1 -1
  110. package/package.json +5 -2
@@ -0,0 +1,204 @@
1
+ // zod-schemas.ts
2
+ import { z } from "zod";
3
+ /**
4
+ * Shared: identifiers and primitive helpers
5
+ */
6
+ export const zPoint = z.object({
7
+ x: z.number().describe("X coordinate relative to the page or element bounding box."),
8
+ y: z.number().describe("Y coordinate relative to the page or element bounding box."),
9
+ });
10
+ export const zMouseButton = z.enum(["left", "middle", "right"]).describe("Mouse button to use.");
11
+ export const zModifierKeys = z
12
+ .array(z.enum(["Alt", "Control", "Meta", "Shift"]))
13
+ .describe("Zero or more modifier keys held for this action.")
14
+ .default([]);
15
+ export const zFrameDescription = z.object({
16
+ pageGuid: z.string().describe("Stable GUID for the page instance."),
17
+ pageAlias: z.string().describe("Human-friendly alias for the page (e.g., 'main', 'popup-1')."),
18
+ framePath: z.array(z.string()).describe("Ordered list of frame selectors/aliases from top to target frame."),
19
+ });
20
+ /**
21
+ * ACTION INTENT (PASS 1): coarse category only
22
+ * Keep this small so an LLM can commit early with high accuracy.
23
+ */
24
+ export const zActionKind = z
25
+ .enum(["click", "form update", "navigation", "assertion", "other"])
26
+ .describe("High-level action category.");
27
+ export const zGeneralActionPlan = z.object({
28
+ kind: zActionKind.describe("Coarse action category chosen first."),
29
+ description: z
30
+ .string()
31
+ .describe("the reasoning behind the classification based on the literal intent of the Gherkin step."),
32
+ });
33
+ /**
34
+ * ACTION SUBTYPE (PASS 2): constrained sub-choices within the category? maybe add as object with values or special
35
+ */
36
+ export const zMouseType = z
37
+ .enum(["click", "doubleClick", "hover"])
38
+ .describe("Specific mouse action.");
39
+ export const zFormUpdateTypes = z
40
+ .enum(["press", "type", "fill", 'select', 'uncheck', 'check', 'setInputFiles', 'clear'])
41
+ .describe("Specific form action to update the form.");
42
+ export const zNavigationType = z
43
+ .enum(["openPage", "navigate", "closePage", 'goBack', 'goForward', 'refresh', 'openInNewTab'])
44
+ .describe("Specific navigation action.");
45
+ export const zAssertionType = z
46
+ .enum(["text visible", "value visible", "checked visible", "aria snapshot visible", "screenshot of element"])
47
+ .describe("Assertion subtype.");
48
+ export const zMouseAction = z.object({
49
+ type: zMouseType,
50
+ params: z.object({
51
+ button: zMouseButton.nullish().default("left").describe("Optional, mouse button to use, not needed for hover, for others it will be left click by default."),
52
+ position: zPoint.nullish().describe("Optional relative offset inside the target element."),
53
+ modifiers: zModifierKeys.nullish().describe("Optional modifier keys to use, not needed for hover, for others it will be no modifiers by default."),
54
+ }),
55
+ });
56
+ export const zFormUpdateAction = z.object({
57
+ type: zFormUpdateTypes,
58
+ params: z.object({
59
+ value: z.string().describe("Value to set for the form update."),
60
+ modifiers: zModifierKeys.nullish().describe("Optional modifier keys to use for the form update."),
61
+ }),
62
+ });
63
+ // TODO: navigation or opening pop ups needs more work most likely
64
+ export const zNavigationAction = z.object({
65
+ type: zNavigationType,
66
+ params: z.object({
67
+ url: z
68
+ .string()
69
+ .nullable()
70
+ .describe("URL to navigate to. Must be a valid URL (starting with http:// or https://) for 'openPage' and 'navigate' types. Empty string for other navigation types (goBack, goForward, refresh, closePage)."),
71
+ }),
72
+ /**
73
+ * Human-readable description of this navigation action for test annotations
74
+ * Should clearly describe what navigation is happening (e.g., "Navigate to login page", "Go back to previous page")
75
+ */
76
+ description: z.string().describe("Human-readable description of this navigation action for test annotations"),
77
+ });
78
+ /**
79
+ * Click action result schema
80
+ * Contains top candidate elements matched against a Gherkin step
81
+ */
82
+ export const zClickActionResult = z.object({
83
+ /**
84
+ * Array of up to 5 candidate elements, ranked by likelihood
85
+ * Each candidate includes its index in the original TargetInfo array
86
+ */
87
+ candidates: z
88
+ .array(z.object({
89
+ /**
90
+ * Index in the original TargetInfo array (0-based)
91
+ * Used to reference back to the captured element
92
+ */
93
+ index: z.number().int().min(0).describe("Index in the original TargetInfo array (0-based)"),
94
+ /**
95
+ * Element tag name (e.g., 'button', 'a', 'input')
96
+ */
97
+ tag: z.string().describe("Element tag name"),
98
+ /**
99
+ * Visible text content of the element
100
+ */
101
+ text: z.string().describe("Visible text content"),
102
+ /**
103
+ * Element ID attribute if present
104
+ */
105
+ id: z.string().nullable().describe("Element ID attribute if present"),
106
+ /**
107
+ * Inferred or explicit ARIA role
108
+ */
109
+ role: z.string().nullable().describe("Inferred or explicit ARIA role"),
110
+ /**
111
+ * Associated label text (from label element or aria-labelledby)
112
+ */
113
+ label: z.string().nullable().describe("Associated label text"),
114
+ /**
115
+ * aria-label attribute value
116
+ */
117
+ ariaLabel: z.string().nullable().describe("aria-label attribute value"),
118
+ /**
119
+ * Optional confidence score (0-1) indicating match likelihood
120
+ * Using nullable instead of optional for compatibility with OpenAI structured outputs
121
+ */
122
+ confidence: z.number().min(0).nullable().describe("Confidence score (0-1) indicating match likelihood"),
123
+ /**
124
+ * Human-readable description of this element for test annotations
125
+ * Should be a clear, concise description that identifies the element (e.g., "Submit button", "Login link", "Email input field")
126
+ */
127
+ description: z.string().describe("Human-readable description of this element for test annotations"),
128
+ }))
129
+ .max(5)
130
+ .describe("Top 5 candidate elements ranked by likelihood"),
131
+ /**
132
+ * Single click type for all candidates
133
+ * Determined from the Gherkin step (e.g., "right click", "double click")
134
+ */
135
+ clickType: z
136
+ .enum(["left", "right", "double", "middle", "hover"])
137
+ .describe("Click type determined from the Gherkin step"),
138
+ /**
139
+ * Brief explanation of the matching logic and reasoning
140
+ */
141
+ reasoning: z.string().describe("Brief explanation of the matching logic and reasoning"),
142
+ });
143
+ // TODO: this maybe needs to be more complex? to make sure it gives the right value and such
144
+ export const zAssertionAction = z.object({
145
+ type: zAssertionType,
146
+ params: z.object({
147
+ expected: z.string().describe("Expected value to assert."),
148
+ }),
149
+ });
150
+ // TODO: this probably will need to just be logged for now
151
+ export const zOtherAction = z.object({
152
+ type: z.literal("custom"),
153
+ params: z.record(z.string(), z.unknown()).describe("Custom parameters for the action."),
154
+ });
155
+ /**
156
+ * ACTION SUBTYPE (PASS 2): Union of all subtype schemas with kind
157
+ * This allows progressive refinement: first get kind, then get specific subtype.
158
+ */
159
+ export const zActionPass2 = z.discriminatedUnion("kind", [
160
+ z.object({ kind: z.literal("mouse") }).merge(zMouseAction),
161
+ z.object({ kind: z.literal("form update") }).merge(zFormUpdateAction),
162
+ z.object({ kind: z.literal("navigation") }).merge(zNavigationAction),
163
+ z.object({ kind: z.literal("assertion") }).merge(zAssertionAction),
164
+ z.object({ kind: z.literal("other") }).merge(zOtherAction),
165
+ ]).describe("Action subtype determined after choosing action kind.");
166
+ /**
167
+ * ACTION DETAILS (PASS 3): parameters, selector link, and signals
168
+ * Each subtype has a focused schema to minimize ambiguity.
169
+ */
170
+ // Mouse params
171
+ export const zMouseParams = z.object({
172
+ button: zMouseButton.default("left"),
173
+ clickCount: z.number().int().min(1).max(2).default(1).describe("1 for click, 2 for double-click."),
174
+ position: zPoint.nullish().describe("Optional relative offset inside the target element."),
175
+ modifiers: zModifierKeys,
176
+ });
177
+ // Keyboard params
178
+ export const zKeyboardPressParams = z.object({
179
+ key: z
180
+ .string()
181
+ .describe("Single key to press. Use Playwright key names (e.g., 'Enter', 'Tab', 'ArrowDown', 'Control+K')."),
182
+ modifiers: zModifierKeys,
183
+ });
184
+ export const zKeyboardTypeParams = z.object({
185
+ text: z.string().describe("Literal text to type (respects existing cursor/focus)."),
186
+ delayMs: z.number().int().min(0).default(0).describe("Optional delay per character."),
187
+ });
188
+ export const zKeyboardFillParams = z.object({
189
+ value: z.string().describe("Final value of the input after filling (replaces existing content)."),
190
+ });
191
+ // Navigation params
192
+ export const zOpenPageParams = z.object({
193
+ url: z.string().url().describe("Absolute URL to open in a new page/tab/context."),
194
+ });
195
+ export const zNavigateParams = z.object({
196
+ url: z.string().describe("URL or path to navigate current page to."),
197
+ });
198
+ export const zClosePageParams = z.object({
199
+ reason: z.string().nullish().describe("Optional rationale for closing (cleanup, end of flow, etc.)."),
200
+ });
201
+ // export type SelectorPlan = z.infer<typeof zSelectorPlan>;
202
+ // export type ActionPlan = z.infer<typeof zActionPlan>;
203
+ // export type ActionInContext = z.infer<typeof zActionInContext>;
204
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/mimic/schema/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ import { Locator, Page } from '@playwright/test';
2
+ import type { SelectorDescriptor } from './selectorDescriptor.js';
3
+ /**
4
+ * TargetInfo: Normalized metadata for a candidate element
5
+ *
6
+ * This represents an element that could be targeted by a Gherkin step.
7
+ * Collected via Playwright page.evaluate in the browser context.
8
+ */
9
+ export type TargetInfo = {
10
+ tag: string;
11
+ text: string;
12
+ id: string | null;
13
+ role: string | null;
14
+ label: string | null;
15
+ ariaLabel: string | null;
16
+ typeAttr: string | null;
17
+ nameAttr: string | null;
18
+ href: string | null;
19
+ dataset: Record<string, string>;
20
+ nthOfType: number;
21
+ };
22
+ /**
23
+ * Element category types for classification
24
+ */
25
+ export type ElementCategory = 'clickable' | 'form' | 'text';
26
+ /**
27
+ * Comprehensive element information for selector generation
28
+ */
29
+ export interface SelectorElement {
30
+ /** Element category: clickable, form, or text */
31
+ category: ElementCategory;
32
+ /** HTML tag name */
33
+ tag: string;
34
+ /** Primary visible text content */
35
+ text: string;
36
+ /** All text-related attributes combined for context */
37
+ descriptiveText: string;
38
+ /** Element ID if present */
39
+ id: string | null;
40
+ /** Inferred or explicit ARIA role */
41
+ role: string | null;
42
+ /** Associated label text */
43
+ label: string | null;
44
+ /** aria-label attribute */
45
+ ariaLabel: string | null;
46
+ /** alt text for images */
47
+ altText: string | null;
48
+ /** title attribute */
49
+ title: string | null;
50
+ /** placeholder text for inputs */
51
+ placeholder: string | null;
52
+ /** aria-describedby text */
53
+ ariaDescribedBy: string | null;
54
+ /** Input type attribute */
55
+ typeAttr: string | null;
56
+ /** Name attribute */
57
+ nameAttr: string | null;
58
+ /** href for links */
59
+ href: string | null;
60
+ /** value attribute for form elements */
61
+ value: string | null;
62
+ /** All data-* attributes */
63
+ dataset: Record<string, string>;
64
+ /** nth-of-type index (1-based) */
65
+ nthOfType: number;
66
+ /** CSS selector path for this element */
67
+ selector: string;
68
+ /** Whether element is visible */
69
+ isVisible: boolean;
70
+ }
71
+ /**
72
+ * Result structure containing all categorized elements
73
+ */
74
+ export interface SelectorResult {
75
+ /** All clickable/interactive elements (buttons, links, etc.) */
76
+ clickableElements: SelectorElement[];
77
+ /** All form input elements */
78
+ formElements: SelectorElement[];
79
+ /** All text/content elements */
80
+ textElements: SelectorElement[];
81
+ /** Total count of all elements */
82
+ totalCount: number;
83
+ }
84
+ /**
85
+ * Options for capturing target elements
86
+ */
87
+ export interface CaptureTargetsOptions {
88
+ /**
89
+ * If true, only capture interactable elements (buttons, links, inputs, etc.)
90
+ * If false (default), capture both interactive and content elements
91
+ */
92
+ interactableOnly?: boolean;
93
+ }
94
+ /**
95
+ * Capture target elements from the page
96
+ *
97
+ * @param page - Playwright Page object
98
+ * @param options - Optional configuration for capturing targets
99
+ * @returns Promise resolving to array of TargetInfo objects
100
+ */
101
+ export declare function captureTargets(page: Page, options?: CaptureTargetsOptions): Promise<TargetInfo[]>;
102
+ /**
103
+ * Build the best Playwright locator for a given target element
104
+ *
105
+ * Follows Playwright's recommended selector priority:
106
+ * 1. data-testid (use page.getByTestId()) - #1 recommendation, most stable
107
+ * 2. Role-based (use page.getByRole()) - #2 recommendation, accessibility-based
108
+ * 3. Text-based (use page.getByText()) - #3 recommendation, good for visible text
109
+ * 4. CSS selectors as fallback (ID, data attributes, name, tag selectors)
110
+ *
111
+ * If a locator matches multiple elements, this function will evaluate each
112
+ * and return the one that best matches the target information.
113
+ *
114
+ * @param page - Playwright Page object
115
+ * @param target - TargetInfo object containing element metadata
116
+ * @returns Playwright Locator for the target element, prioritized by Playwright's best practices
117
+ */
118
+ export declare function buildSelectorForTarget(page: Page, target?: TargetInfo): Promise<Locator | null>;
119
+ /**
120
+ * Generate the best Playwright selector for a given element
121
+ *
122
+ * Analyzes an element and its parent hierarchy to find the best selector
123
+ * following Playwright's recommended practices. Verifies uniqueness at each step.
124
+ *
125
+ * Priority order:
126
+ * 1. data-testid → getByTestId()
127
+ * 2. role + name (aria-label/label) → getByRole()
128
+ * 3. label → getByLabel()
129
+ * 4. placeholder → getByPlaceholder()
130
+ * 5. alt → getByAltText()
131
+ * 6. title → getByTitle()
132
+ * 7. text → getByText()
133
+ * 8. CSS fallback (ID, name, tag + nth-of-type)
134
+ *
135
+ * @param locator - Playwright Locator pointing to the target element
136
+ * @returns Promise resolving to SelectorDescriptor that uniquely identifies the element
137
+ */
138
+ export declare function generateBestSelectorForElement(locator: Locator): Promise<SelectorDescriptor>;
139
+ //# sourceMappingURL=selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../src/mimic/selector.ts"],"names":[],"mappings":"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"}