@sun-asterisk/sungen 1.0.20 → 1.0.21
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.
- package/dist/cli/commands/add.d.ts +3 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +27 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/cache-clear.d.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts.map +1 -0
- package/dist/cli/commands/cache-clear.js +24 -0
- package/dist/cli/commands/cache-clear.js.map +1 -0
- package/dist/cli/commands/full.d.ts +3 -0
- package/dist/cli/commands/full.d.ts.map +1 -0
- package/dist/cli/commands/full.js +37 -0
- package/dist/cli/commands/full.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +53 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +20 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/live-scan.d.ts +3 -0
- package/dist/cli/commands/live-scan.d.ts.map +1 -0
- package/dist/cli/commands/{live-scan-command.js → live-scan.js} +8 -15
- package/dist/cli/commands/live-scan.js.map +1 -0
- package/dist/cli/commands/makeauth.d.ts +3 -0
- package/dist/cli/commands/makeauth.d.ts.map +1 -0
- package/dist/cli/commands/makeauth.js +76 -0
- package/dist/cli/commands/makeauth.js.map +1 -0
- package/dist/cli/commands/map.d.ts +3 -0
- package/dist/cli/commands/map.d.ts.map +1 -0
- package/dist/cli/commands/map.js +93 -0
- package/dist/cli/commands/map.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +43 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.js +29 -442
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/types.d.ts +9 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +7 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/utils.d.ts +6 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +101 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/core/live-scanner/matrix-reader.d.ts.map +1 -1
- package/dist/core/live-scanner/matrix-reader.js +2 -40
- package/dist/core/live-scanner/matrix-reader.js.map +1 -1
- package/dist/core/live-scanner/step-replayer.d.ts.map +1 -1
- package/dist/core/live-scanner/step-replayer.js +7 -0
- package/dist/core/live-scanner/step-replayer.js.map +1 -1
- package/dist/core/validator/selector-validator.d.ts.map +1 -1
- package/dist/core/validator/selector-validator.js +2 -1
- package/dist/core/validator/selector-validator.js.map +1 -1
- package/dist/generators/scaffold-generator/index.d.ts +2 -1
- package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
- package/dist/generators/scaffold-generator/index.js +21 -1
- package/dist/generators/scaffold-generator/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +95 -58
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -2
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.js +34 -47
- package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +3 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +20 -3
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +44 -85
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.js +98 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -2
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +14 -42
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/setup-patterns.js +23 -35
- package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +18 -3
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +0 -15
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +4 -106
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/{executor/test-generator.d.ts → generators/test-generator/types.d.ts} +4 -25
- package/dist/generators/test-generator/types.d.ts.map +1 -0
- package/dist/generators/test-generator/types.js +106 -0
- package/dist/generators/test-generator/types.js.map +1 -0
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +8 -17
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +10 -18
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/cache-manager.d.ts +1 -23
- package/dist/orchestrator/cache-manager.d.ts.map +1 -1
- package/dist/orchestrator/cache-manager.js +1 -87
- package/dist/orchestrator/cache-manager.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +11 -28
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +52 -371
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/reporter.d.ts +1 -1
- package/dist/orchestrator/reporter.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +1 -1
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/utils/feature-finder.d.ts +9 -0
- package/dist/utils/feature-finder.d.ts.map +1 -0
- package/dist/utils/feature-finder.js +67 -0
- package/dist/utils/feature-finder.js.map +1 -0
- package/dist/utils/screen-paths.d.ts +10 -0
- package/dist/utils/screen-paths.d.ts.map +1 -0
- package/dist/utils/screen-paths.js +73 -0
- package/dist/utils/screen-paths.js.map +1 -0
- package/dist/utils/selector-loader.d.ts +6 -0
- package/dist/utils/selector-loader.d.ts.map +1 -0
- package/dist/utils/selector-loader.js +20 -0
- package/dist/utils/selector-loader.js.map +1 -0
- package/dist/utils/selector-types.d.ts +7 -0
- package/dist/utils/selector-types.d.ts.map +1 -0
- package/dist/utils/selector-types.js +19 -0
- package/dist/utils/selector-types.js.map +1 -0
- package/dist/utils/test-data-loader.d.ts +6 -0
- package/dist/utils/test-data-loader.d.ts.map +1 -0
- package/dist/utils/test-data-loader.js +20 -0
- package/dist/utils/test-data-loader.js.map +1 -0
- package/dist/utils/yaml-io.d.ts +14 -0
- package/dist/utils/yaml-io.d.ts.map +1 -0
- package/dist/utils/yaml-io.js +72 -0
- package/dist/utils/yaml-io.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/commands/add.ts +25 -0
- package/src/cli/commands/cache-clear.ts +22 -0
- package/src/cli/commands/full.ts +35 -0
- package/src/cli/commands/generate.ts +55 -0
- package/src/cli/commands/init.ts +17 -0
- package/src/cli/commands/{live-scan-command.ts → live-scan.ts} +8 -17
- package/src/cli/commands/makeauth.ts +77 -0
- package/src/cli/commands/map.ts +97 -0
- package/src/cli/commands/validate.ts +43 -0
- package/src/cli/index.ts +32 -473
- package/src/cli/types.ts +9 -0
- package/src/cli/utils.ts +106 -0
- package/src/core/live-scanner/matrix-reader.ts +2 -8
- package/src/core/live-scanner/step-replayer.ts +7 -0
- package/src/core/validator/selector-validator.ts +3 -2
- package/src/generators/scaffold-generator/index.ts +23 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
- package/src/generators/test-generator/patterns/assertion-patterns.ts +102 -62
- package/src/generators/test-generator/patterns/form-patterns.ts +38 -60
- package/src/generators/test-generator/patterns/index.ts +22 -4
- package/src/generators/test-generator/patterns/interaction-patterns.ts +47 -107
- package/src/generators/test-generator/patterns/legacy-patterns.ts +104 -0
- package/src/generators/test-generator/patterns/navigation-patterns.ts +27 -69
- package/src/generators/test-generator/patterns/setup-patterns.ts +23 -41
- package/src/generators/test-generator/patterns/types.ts +26 -9
- package/src/generators/test-generator/step-mapper.ts +4 -124
- package/src/generators/test-generator/types.ts +131 -0
- package/src/generators/test-generator/utils/data-resolver.ts +8 -13
- package/src/generators/test-generator/utils/selector-resolver.ts +15 -17
- package/src/orchestrator/cache-manager.ts +1 -107
- package/src/orchestrator/pipeline.ts +58 -433
- package/src/orchestrator/reporter.ts +1 -1
- package/src/orchestrator/screen-manager.ts +1 -1
- package/src/utils/feature-finder.ts +33 -0
- package/src/utils/screen-paths.ts +37 -0
- package/src/utils/selector-loader.ts +23 -0
- package/src/utils/selector-types.ts +17 -0
- package/src/utils/test-data-loader.ts +23 -0
- package/src/utils/yaml-io.ts +33 -0
- package/dist/cli/commands/auto-tag-command.d.ts +0 -8
- package/dist/cli/commands/auto-tag-command.d.ts.map +0 -1
- package/dist/cli/commands/auto-tag-command.js +0 -104
- package/dist/cli/commands/auto-tag-command.js.map +0 -1
- package/dist/cli/commands/live-scan-command.d.ts +0 -9
- package/dist/cli/commands/live-scan-command.d.ts.map +0 -1
- package/dist/cli/commands/live-scan-command.js.map +0 -1
- package/dist/executor/playwright/playwright-generator.d.ts +0 -33
- package/dist/executor/playwright/playwright-generator.d.ts.map +0 -1
- package/dist/executor/playwright/playwright-generator.js +0 -136
- package/dist/executor/playwright/playwright-generator.js.map +0 -1
- package/dist/executor/test-generator.d.ts.map +0 -1
- package/dist/executor/test-generator.js +0 -30
- package/dist/executor/test-generator.js.map +0 -1
- package/dist/generators/cli.d.ts +0 -7
- package/dist/generators/cli.d.ts.map +0 -1
- package/dist/generators/cli.js +0 -570
- package/dist/generators/cli.js.map +0 -1
- package/dist/input/cli-adapter.d.ts +0 -75
- package/dist/input/cli-adapter.d.ts.map +0 -1
- package/dist/input/cli-adapter.js +0 -218
- package/dist/input/cli-adapter.js.map +0 -1
- package/dist/input/config-adapter.d.ts +0 -25
- package/dist/input/config-adapter.d.ts.map +0 -1
- package/dist/input/config-adapter.js +0 -70
- package/dist/input/config-adapter.js.map +0 -1
- package/dist/input/input-adapter.d.ts +0 -28
- package/dist/input/input-adapter.d.ts.map +0 -1
- package/dist/input/input-adapter.js +0 -17
- package/dist/input/input-adapter.js.map +0 -1
- package/dist/input/vscode-adapter.d.ts +0 -62
- package/dist/input/vscode-adapter.d.ts.map +0 -1
- package/dist/input/vscode-adapter.js +0 -64
- package/dist/input/vscode-adapter.js.map +0 -1
- package/dist/tools/auto-tagger.d.ts +0 -107
- package/dist/tools/auto-tagger.d.ts.map +0 -1
- package/dist/tools/auto-tagger.js +0 -502
- package/dist/tools/auto-tagger.js.map +0 -1
- package/src/cli/commands/auto-tag-command.ts +0 -80
- package/src/executor/playwright/playwright-generator.ts +0 -125
- package/src/executor/test-generator.ts +0 -90
- package/src/generators/cli.ts +0 -640
- package/src/input/cli-adapter.ts +0 -233
- package/src/input/config-adapter.ts +0 -71
- package/src/input/input-adapter.ts +0 -32
- package/src/input/vscode-adapter.ts +0 -90
- package/src/tools/auto-tagger.ts +0 -572
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { ParsedStep } from '../../gherkin-parser';
|
|
2
|
-
import { StepPattern } from './types';
|
|
2
|
+
import { StepPattern, StepTemplateData } from './types';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Form action patterns: fill, type, select, check, uncheck
|
|
6
|
-
* Uses template engine for framework-agnostic code generation
|
|
7
|
-
* Resolvers return metadata, templates handle framework syntax
|
|
8
6
|
*/
|
|
9
7
|
export const formPatterns: StepPattern[] = [
|
|
10
8
|
{
|
|
@@ -14,7 +12,7 @@ export const formPatterns: StepPattern[] = [
|
|
|
14
12
|
step.elementType === 'uploader' &&
|
|
15
13
|
!!step.selectorRef &&
|
|
16
14
|
!!(step.dataRef || step.value),
|
|
17
|
-
|
|
15
|
+
resolver: (step, context) => {
|
|
18
16
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
19
17
|
|
|
20
18
|
let fileName: string;
|
|
@@ -28,14 +26,9 @@ export const formPatterns: StepPattern[] = [
|
|
|
28
26
|
fileName = step.value!;
|
|
29
27
|
}
|
|
30
28
|
|
|
31
|
-
const code = context.templateEngine.renderStep('upload-action', {
|
|
32
|
-
...resolved,
|
|
33
|
-
selectorRef: step.selectorRef,
|
|
34
|
-
fileName,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
29
|
return {
|
|
38
|
-
|
|
30
|
+
templateName: 'upload-action',
|
|
31
|
+
data: { ...resolved, selectorRef: step.selectorRef, fileName },
|
|
39
32
|
comment: `Upload file ${fileName} via ${step.selectorRef}`,
|
|
40
33
|
};
|
|
41
34
|
},
|
|
@@ -45,31 +38,23 @@ export const formPatterns: StepPattern[] = [
|
|
|
45
38
|
name: 'fill-input',
|
|
46
39
|
matcher: (step: ParsedStep) =>
|
|
47
40
|
(step.text.includes('fills') || step.text.includes('fill') || step.text.includes('inputs') || step.text.includes('input')) && !!step.selectorRef && !!(step.dataRef || step.value),
|
|
48
|
-
|
|
41
|
+
resolver: (step, context) => {
|
|
49
42
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
50
|
-
|
|
51
|
-
// Resolve data reference to actual value
|
|
43
|
+
|
|
52
44
|
let value: string;
|
|
53
45
|
if (step.dataRef) {
|
|
54
46
|
try {
|
|
55
47
|
value = context.dataResolver.resolveData(step.dataRef, context.featureName);
|
|
56
48
|
} catch (error) {
|
|
57
|
-
// Fallback: keep as template literal if data resolution fails
|
|
58
49
|
value = `\${${step.dataRef}}`;
|
|
59
50
|
}
|
|
60
51
|
} else {
|
|
61
52
|
value = step.value!;
|
|
62
53
|
}
|
|
63
|
-
|
|
64
|
-
// Use template engine to render framework-specific code
|
|
65
|
-
const code = context.templateEngine.renderStep('fill-action', {
|
|
66
|
-
...resolved, // strategy, value, role, name, selector
|
|
67
|
-
selectorRef: step.selectorRef,
|
|
68
|
-
fillValue: value,
|
|
69
|
-
});
|
|
70
|
-
|
|
54
|
+
|
|
71
55
|
return {
|
|
72
|
-
|
|
56
|
+
templateName: 'fill-action',
|
|
57
|
+
data: { ...resolved, selectorRef: step.selectorRef, fillValue: value },
|
|
73
58
|
comment: `Fill ${step.selectorRef} with ${step.dataRef || step.value}`,
|
|
74
59
|
};
|
|
75
60
|
},
|
|
@@ -79,13 +64,11 @@ export const formPatterns: StepPattern[] = [
|
|
|
79
64
|
name: 'check-checkbox',
|
|
80
65
|
matcher: (step: ParsedStep) =>
|
|
81
66
|
step.text.includes('checks') && !!step.selectorRef,
|
|
82
|
-
|
|
67
|
+
resolver: (step, context) => {
|
|
83
68
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
84
|
-
|
|
85
|
-
const code = context.templateEngine.renderStep('check-action', { ...resolved, selectorRef: step.selectorRef });
|
|
86
|
-
|
|
87
69
|
return {
|
|
88
|
-
|
|
70
|
+
templateName: 'check-action',
|
|
71
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
89
72
|
comment: `Check ${step.selectorRef}`,
|
|
90
73
|
};
|
|
91
74
|
},
|
|
@@ -95,13 +78,11 @@ export const formPatterns: StepPattern[] = [
|
|
|
95
78
|
name: 'uncheck-checkbox',
|
|
96
79
|
matcher: (step: ParsedStep) =>
|
|
97
80
|
step.text.includes('unchecks') && !!step.selectorRef,
|
|
98
|
-
|
|
81
|
+
resolver: (step, context) => {
|
|
99
82
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
100
|
-
|
|
101
|
-
const code = context.templateEngine.renderStep('uncheck-action', { ...resolved, selectorRef: step.selectorRef });
|
|
102
|
-
|
|
103
83
|
return {
|
|
104
|
-
|
|
84
|
+
templateName: 'uncheck-action',
|
|
85
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
105
86
|
comment: `Uncheck ${step.selectorRef}`,
|
|
106
87
|
};
|
|
107
88
|
},
|
|
@@ -113,10 +94,9 @@ export const formPatterns: StepPattern[] = [
|
|
|
113
94
|
(step.text.includes('selects') || step.text.match(/\bselect\b/)) &&
|
|
114
95
|
!!step.selectorRef &&
|
|
115
96
|
!!(step.dataRef || step.value),
|
|
116
|
-
|
|
97
|
+
resolver: (step, context): StepTemplateData => {
|
|
117
98
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
118
99
|
|
|
119
|
-
// Resolve data reference to actual value
|
|
120
100
|
let value: string;
|
|
121
101
|
if (step.dataRef) {
|
|
122
102
|
try {
|
|
@@ -128,32 +108,34 @@ export const formPatterns: StepPattern[] = [
|
|
|
128
108
|
value = step.value!;
|
|
129
109
|
}
|
|
130
110
|
|
|
131
|
-
// Determine action based on role type
|
|
132
|
-
// Radio buttons use check(), dropdowns use selectOption()
|
|
133
111
|
const isRadio = resolved.role === 'radio' || step.text.includes('radio');
|
|
134
112
|
const isCheckbox = resolved.role === 'checkbox' || step.text.includes('checkbox');
|
|
135
113
|
|
|
136
|
-
let
|
|
114
|
+
let templateName: string;
|
|
115
|
+
let data: Record<string, any>;
|
|
116
|
+
|
|
137
117
|
if (isRadio) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
...resolved,
|
|
141
|
-
selectorRef: step.selectorRef,
|
|
142
|
-
selectValue: value,
|
|
143
|
-
});
|
|
118
|
+
templateName = 'radio-select-action';
|
|
119
|
+
data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
|
|
144
120
|
} else if (isCheckbox) {
|
|
145
|
-
|
|
121
|
+
templateName = 'check-action';
|
|
122
|
+
data = { ...resolved, selectorRef: step.selectorRef };
|
|
146
123
|
} else {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
124
|
+
const nativeSelectRoles = ['combobox', 'listbox', 'select'];
|
|
125
|
+
const isNativeSelect = nativeSelectRoles.includes(resolved.role);
|
|
126
|
+
|
|
127
|
+
if (isNativeSelect) {
|
|
128
|
+
templateName = 'select-action';
|
|
129
|
+
data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
|
|
130
|
+
} else {
|
|
131
|
+
templateName = 'click-select-action';
|
|
132
|
+
data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
|
|
133
|
+
}
|
|
153
134
|
}
|
|
154
135
|
|
|
155
136
|
return {
|
|
156
|
-
|
|
137
|
+
templateName,
|
|
138
|
+
data,
|
|
157
139
|
comment: `Select ${step.dataRef || step.value} in ${step.selectorRef}`,
|
|
158
140
|
};
|
|
159
141
|
},
|
|
@@ -163,18 +145,14 @@ export const formPatterns: StepPattern[] = [
|
|
|
163
145
|
name: 'clear-input',
|
|
164
146
|
matcher: (step: ParsedStep) =>
|
|
165
147
|
step.text.includes('clears') && !!step.selectorRef,
|
|
166
|
-
|
|
148
|
+
resolver: (step, context) => {
|
|
167
149
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
168
|
-
|
|
169
|
-
const code = context.templateEngine.renderStep('clear-action', { ...resolved, selectorRef: step.selectorRef });
|
|
170
|
-
|
|
171
150
|
return {
|
|
172
|
-
|
|
151
|
+
templateName: 'clear-action',
|
|
152
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
173
153
|
comment: `Clear ${step.selectorRef}`,
|
|
174
154
|
};
|
|
175
155
|
},
|
|
176
156
|
priority: 7,
|
|
177
157
|
},
|
|
178
158
|
];
|
|
179
|
-
|
|
180
|
-
|
|
@@ -6,6 +6,7 @@ import { formPatterns } from './form-patterns';
|
|
|
6
6
|
import { interactionPatterns } from './interaction-patterns';
|
|
7
7
|
import { assertionPatterns } from './assertion-patterns';
|
|
8
8
|
import { setupPatterns } from './setup-patterns';
|
|
9
|
+
import { legacyPatterns } from './legacy-patterns';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Pattern Registry - manages all step patterns
|
|
@@ -26,7 +27,8 @@ export class PatternRegistry {
|
|
|
26
27
|
this.patterns.push(...formPatterns);
|
|
27
28
|
this.patterns.push(...interactionPatterns);
|
|
28
29
|
this.patterns.push(...assertionPatterns);
|
|
29
|
-
|
|
30
|
+
this.patterns.push(...legacyPatterns);
|
|
31
|
+
|
|
30
32
|
// Sort by priority (higher first)
|
|
31
33
|
this.patterns.sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
32
34
|
}
|
|
@@ -52,15 +54,30 @@ export class PatternRegistry {
|
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
/**
|
|
55
|
-
* Generate code for a step using matched pattern
|
|
57
|
+
* Generate code for a step using matched pattern.
|
|
58
|
+
* Prefers resolver (returns template data) over generator (renders directly).
|
|
56
59
|
*/
|
|
57
60
|
generateStep(step: ParsedStep, context: PatternContext): MappedStep | null {
|
|
58
61
|
const pattern = this.findPattern(step);
|
|
59
62
|
if (!pattern) {
|
|
60
63
|
return null;
|
|
61
64
|
}
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
|
|
66
|
+
// Prefer resolver (framework-agnostic) over generator (legacy)
|
|
67
|
+
if (pattern.resolver) {
|
|
68
|
+
const resolved = pattern.resolver(step, context);
|
|
69
|
+
const code = context.templateEngine.renderStep(resolved.templateName, resolved.data);
|
|
70
|
+
return {
|
|
71
|
+
code,
|
|
72
|
+
comment: resolved.comment,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (pattern.generator) {
|
|
77
|
+
return pattern.generator(step, context);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return null;
|
|
64
81
|
}
|
|
65
82
|
|
|
66
83
|
/**
|
|
@@ -94,4 +111,5 @@ export { navigationPatterns } from './navigation-patterns';
|
|
|
94
111
|
export { formPatterns } from './form-patterns';
|
|
95
112
|
export { interactionPatterns } from './interaction-patterns';
|
|
96
113
|
export { assertionPatterns } from './assertion-patterns';
|
|
114
|
+
export { legacyPatterns } from './legacy-patterns';
|
|
97
115
|
export * from './types';
|
|
@@ -14,7 +14,6 @@ function extractWaitState(text: string): string {
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Map a plain element keyword (no brackets) to a Playwright ARIA role.
|
|
17
|
-
* e.g. "dialog" → "dialog", "modal" → "dialog", "alert" → "alertdialog"
|
|
18
17
|
*/
|
|
19
18
|
function elementKeywordToRole(text: string): string | null {
|
|
20
19
|
const match = text.match(/\bwait(?:s)?\s+for\s+(dialog|modal|alert|alertdialog|tooltip|menu|listbox|combobox|grid|table|status|banner|navigation|main|region)\b/i);
|
|
@@ -29,32 +28,21 @@ function elementKeywordToRole(text: string): string | null {
|
|
|
29
28
|
|
|
30
29
|
/**
|
|
31
30
|
* Interaction patterns: click, hover, press, wait
|
|
32
|
-
* Uses template engine for framework-agnostic code generation
|
|
33
31
|
*/
|
|
34
32
|
export const interactionPatterns: StepPattern[] = [
|
|
35
|
-
// Unknown element with variable pattern (selector value is empty, identified by filter)
|
|
36
|
-
// Matches: "When User click [target order] row with {{order_name}}"
|
|
37
|
-
// Generates: await page.getByText('').filter({ hasText: /.*value of order_name$/ }).click();
|
|
38
33
|
{
|
|
39
34
|
name: 'unknown-element-action',
|
|
40
35
|
matcher: (step: ParsedStep) => {
|
|
41
|
-
// Check if selectorRef starts with "target " (target element indicator)
|
|
42
36
|
const isTargetElement = step.selectorRef && /^target\s/i.test(step.selectorRef);
|
|
43
|
-
// Must have both selector and variable, and "with" clause
|
|
44
|
-
// But EXCLUDE assertion verbs (see, sees) - those should use assertion patterns
|
|
45
37
|
const isInteractionAction = !step.text.includes('see') && !step.text.includes('sees');
|
|
46
38
|
return isTargetElement && !!step.dataRef && step.text.includes('with') && isInteractionAction;
|
|
47
39
|
},
|
|
48
|
-
|
|
49
|
-
// Resolve selector value from YAML (e.g., target.order)
|
|
40
|
+
resolver: (step, context) => {
|
|
50
41
|
let selectorValue = '';
|
|
51
42
|
let nth = 0;
|
|
52
43
|
try {
|
|
53
44
|
const resolved = context.selectorResolver.resolveSelector(
|
|
54
|
-
step.selectorRef!,
|
|
55
|
-
context.featureName,
|
|
56
|
-
step.elementType,
|
|
57
|
-
step.nth
|
|
45
|
+
step.selectorRef!, context.featureName, step.elementType, step.nth
|
|
58
46
|
);
|
|
59
47
|
selectorValue = resolved.value || '';
|
|
60
48
|
nth = resolved.nth || 0;
|
|
@@ -63,7 +51,6 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
63
51
|
nth = 0;
|
|
64
52
|
}
|
|
65
53
|
|
|
66
|
-
// Resolve data variable value
|
|
67
54
|
let dataValue: string;
|
|
68
55
|
try {
|
|
69
56
|
dataValue = context.dataResolver.resolveData(step.dataRef!, context.featureName);
|
|
@@ -71,27 +58,17 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
71
58
|
dataValue = `\${${step.dataRef}}`;
|
|
72
59
|
}
|
|
73
60
|
|
|
74
|
-
// Determine the action method (click, hover, etc.)
|
|
75
61
|
let actionMethod = 'click';
|
|
76
|
-
if (step.text.includes('hover'))
|
|
77
|
-
|
|
78
|
-
} else if (step.text.includes('double')) {
|
|
79
|
-
actionMethod = 'dblclick';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const code = context.templateEngine.renderStep('unknown-element-action', {
|
|
83
|
-
selectorValue,
|
|
84
|
-
dataValue,
|
|
85
|
-
action: actionMethod,
|
|
86
|
-
nth,
|
|
87
|
-
});
|
|
62
|
+
if (step.text.includes('hover')) actionMethod = 'hover';
|
|
63
|
+
else if (step.text.includes('double')) actionMethod = 'dblclick';
|
|
88
64
|
|
|
89
65
|
return {
|
|
90
|
-
|
|
66
|
+
templateName: 'unknown-element-action',
|
|
67
|
+
data: { selectorValue, dataValue, action: actionMethod, nth },
|
|
91
68
|
comment: `${actionMethod.charAt(0).toUpperCase() + actionMethod.slice(1)} ${step.selectorRef} with ${step.dataRef}`,
|
|
92
69
|
};
|
|
93
70
|
},
|
|
94
|
-
priority: 15,
|
|
71
|
+
priority: 15,
|
|
95
72
|
},
|
|
96
73
|
{
|
|
97
74
|
name: 'click-element-with-text',
|
|
@@ -100,7 +77,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
100
77
|
&& !!step.selectorRef
|
|
101
78
|
&& !!(step.dataRef || step.value)
|
|
102
79
|
&& step.text.includes('with'),
|
|
103
|
-
|
|
80
|
+
resolver: (step, context) => {
|
|
104
81
|
const resolved = context.selectorResolver.resolveSelector(
|
|
105
82
|
step.selectorRef!, undefined, step.elementType, step.nth
|
|
106
83
|
);
|
|
@@ -116,16 +93,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
116
93
|
}
|
|
117
94
|
}
|
|
118
95
|
|
|
119
|
-
// When using .filter({ hasText }), name is redundant — data value identifies the element
|
|
120
96
|
const { name: _name, ...resolvedWithoutName } = resolved;
|
|
121
97
|
|
|
122
|
-
const code = context.templateEngine.renderStep('click-element-with-text', {
|
|
123
|
-
...resolvedWithoutName,
|
|
124
|
-
dataValue,
|
|
125
|
-
});
|
|
126
|
-
|
|
127
98
|
return {
|
|
128
|
-
|
|
99
|
+
templateName: 'click-element-with-text',
|
|
100
|
+
data: { ...resolvedWithoutName, dataValue },
|
|
129
101
|
comment: `Click ${step.selectorRef} with text ${step.dataRef || step.value}`,
|
|
130
102
|
};
|
|
131
103
|
},
|
|
@@ -135,13 +107,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
135
107
|
name: 'click-element',
|
|
136
108
|
matcher: (step: ParsedStep) =>
|
|
137
109
|
(step.text.includes('clicks') || step.text.includes('click')) && !!step.selectorRef,
|
|
138
|
-
|
|
110
|
+
resolver: (step, context) => {
|
|
139
111
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
140
|
-
|
|
141
|
-
const code = context.templateEngine.renderStep('click-action', { ...resolved, selectorRef: step.selectorRef });
|
|
142
|
-
|
|
143
112
|
return {
|
|
144
|
-
|
|
113
|
+
templateName: 'click-action',
|
|
114
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
145
115
|
comment: `Click ${step.selectorRef}`,
|
|
146
116
|
};
|
|
147
117
|
},
|
|
@@ -152,13 +122,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
152
122
|
matcher: (step: ParsedStep) =>
|
|
153
123
|
(step.text.includes('double click') || step.text.includes('double-click') ||
|
|
154
124
|
(step.text.includes('double') && step.text.includes('clicks'))) && !!step.selectorRef,
|
|
155
|
-
|
|
125
|
+
resolver: (step, context) => {
|
|
156
126
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
157
|
-
|
|
158
|
-
const code = context.templateEngine.renderStep('double-click-action', { ...resolved, selectorRef: step.selectorRef });
|
|
159
|
-
|
|
160
127
|
return {
|
|
161
|
-
|
|
128
|
+
templateName: 'double-click-action',
|
|
129
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
162
130
|
comment: `Double click ${step.selectorRef}`,
|
|
163
131
|
};
|
|
164
132
|
},
|
|
@@ -168,13 +136,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
168
136
|
name: 'hover-element',
|
|
169
137
|
matcher: (step: ParsedStep) =>
|
|
170
138
|
step.text.includes('hovers') && !!step.selectorRef,
|
|
171
|
-
|
|
139
|
+
resolver: (step, context) => {
|
|
172
140
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
173
|
-
|
|
174
|
-
const code = context.templateEngine.renderStep('hover-action', { ...resolved, selectorRef: step.selectorRef });
|
|
175
|
-
|
|
176
141
|
return {
|
|
177
|
-
|
|
142
|
+
templateName: 'hover-action',
|
|
143
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
178
144
|
comment: `Hover ${step.selectorRef}`,
|
|
179
145
|
};
|
|
180
146
|
},
|
|
@@ -184,16 +150,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
184
150
|
name: 'press-enter',
|
|
185
151
|
matcher: (step: ParsedStep) =>
|
|
186
152
|
step.text.includes('presses') && step.text.includes('Enter') && !!step.selectorRef,
|
|
187
|
-
|
|
153
|
+
resolver: (step, context) => {
|
|
188
154
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
189
|
-
|
|
190
|
-
const code = context.templateEngine.renderStep('press-action', {
|
|
191
|
-
...resolved,
|
|
192
|
-
key: 'Enter',
|
|
193
|
-
});
|
|
194
|
-
|
|
195
155
|
return {
|
|
196
|
-
|
|
156
|
+
templateName: 'press-action',
|
|
157
|
+
data: { ...resolved, key: 'Enter' },
|
|
197
158
|
comment: `Press Enter in ${step.selectorRef}`,
|
|
198
159
|
};
|
|
199
160
|
},
|
|
@@ -203,8 +164,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
203
164
|
name: 'click-by-data-text',
|
|
204
165
|
matcher: (step: ParsedStep) =>
|
|
205
166
|
(step.text.includes('clicks') || step.text.includes('click')) && !step.selectorRef && !!step.dataRef,
|
|
206
|
-
|
|
207
|
-
// Resolve data reference to actual value
|
|
167
|
+
resolver: (step, context) => {
|
|
208
168
|
let value: string;
|
|
209
169
|
try {
|
|
210
170
|
value = context.dataResolver.resolveData(step.dataRef!, context.featureName);
|
|
@@ -212,43 +172,36 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
212
172
|
value = `\${${step.dataRef}}`;
|
|
213
173
|
}
|
|
214
174
|
|
|
215
|
-
const code = context.templateEngine.renderStep('click-action', {
|
|
216
|
-
strategy: 'text',
|
|
217
|
-
value,
|
|
218
|
-
nth: 0,
|
|
219
|
-
});
|
|
220
|
-
|
|
221
175
|
return {
|
|
222
|
-
|
|
176
|
+
templateName: 'click-action',
|
|
177
|
+
data: { strategy: 'text', value, nth: 0 },
|
|
223
178
|
comment: `Click ${step.dataRef}`,
|
|
224
179
|
};
|
|
225
180
|
},
|
|
226
|
-
priority: 5,
|
|
181
|
+
priority: 5,
|
|
227
182
|
},
|
|
228
183
|
{
|
|
229
184
|
name: 'wait-for-time',
|
|
230
185
|
matcher: (step: ParsedStep) =>
|
|
231
186
|
(step.text.includes('wait for') || step.text.includes('waits for')) && /\d+/.test(step.text),
|
|
232
|
-
|
|
187
|
+
resolver: (step, context) => {
|
|
233
188
|
const match = step.text.match(/(\d+)\s*(seconds?|ms|milliseconds?)/);
|
|
234
189
|
let duration = 1000;
|
|
235
|
-
|
|
190
|
+
|
|
236
191
|
if (match) {
|
|
237
192
|
const num = parseInt(match[1]);
|
|
238
193
|
const unit = match[2].toLowerCase();
|
|
239
194
|
duration = unit.startsWith('s') ? num * 1000 : num;
|
|
240
195
|
}
|
|
241
|
-
|
|
242
|
-
const code = context.templateEngine.renderStep('wait-timeout', { duration });
|
|
243
|
-
|
|
196
|
+
|
|
244
197
|
return {
|
|
245
|
-
|
|
198
|
+
templateName: 'wait-timeout',
|
|
199
|
+
data: { duration },
|
|
246
200
|
comment: `Wait for ${duration}ms`,
|
|
247
201
|
};
|
|
248
202
|
},
|
|
249
203
|
priority: 7,
|
|
250
204
|
},
|
|
251
|
-
// "wait for dialog with {{kudo.title}} hidden" - role keyword inline, no selector brackets, with data filter
|
|
252
205
|
{
|
|
253
206
|
name: 'wait-for-role-with-text',
|
|
254
207
|
matcher: (step: ParsedStep) =>
|
|
@@ -256,7 +209,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
256
209
|
!step.selectorRef &&
|
|
257
210
|
!!step.dataRef &&
|
|
258
211
|
!!elementKeywordToRole(step.text),
|
|
259
|
-
|
|
212
|
+
resolver: (step, context) => {
|
|
260
213
|
const role = elementKeywordToRole(step.text)!;
|
|
261
214
|
|
|
262
215
|
let dataValue: string;
|
|
@@ -268,15 +221,14 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
268
221
|
|
|
269
222
|
const state = extractWaitState(step.text);
|
|
270
223
|
|
|
271
|
-
// Render inline — no locator partial needed, role is known directly
|
|
272
224
|
return {
|
|
273
|
-
|
|
225
|
+
templateName: 'wait-for-role-with-data',
|
|
226
|
+
data: { role, dataValue, state },
|
|
274
227
|
comment: `Wait for ${role} with ${step.dataRef} to be ${state}`,
|
|
275
228
|
};
|
|
276
229
|
},
|
|
277
230
|
priority: 11,
|
|
278
231
|
},
|
|
279
|
-
// "wait for dialog hidden" - role keyword inline, no selector brackets, no data filter
|
|
280
232
|
{
|
|
281
233
|
name: 'wait-for-role',
|
|
282
234
|
matcher: (step: ParsedStep) =>
|
|
@@ -284,32 +236,32 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
284
236
|
!step.selectorRef &&
|
|
285
237
|
!step.dataRef &&
|
|
286
238
|
!!elementKeywordToRole(step.text),
|
|
287
|
-
|
|
239
|
+
resolver: (step, context) => {
|
|
288
240
|
const role = elementKeywordToRole(step.text)!;
|
|
289
241
|
const state = extractWaitState(step.text);
|
|
290
242
|
|
|
291
243
|
return {
|
|
292
|
-
|
|
244
|
+
templateName: 'wait-for-role',
|
|
245
|
+
data: { role, state },
|
|
293
246
|
comment: `Wait for ${role} to be ${state}`,
|
|
294
247
|
};
|
|
295
248
|
},
|
|
296
249
|
priority: 11,
|
|
297
250
|
},
|
|
298
|
-
// NEW: Wait for page pattern
|
|
299
251
|
{
|
|
300
252
|
name: 'wait-for-page',
|
|
301
253
|
matcher: (step: ParsedStep) =>
|
|
302
254
|
(step.text.includes('wait for') || step.text.includes('waits for')) && step.elementType === 'page',
|
|
303
|
-
|
|
255
|
+
resolver: (step, context) => {
|
|
304
256
|
const path = step.featurePath || '/';
|
|
305
257
|
const pathRegex = path.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
|
|
306
|
-
const code = context.templateEngine.renderStep('wait-for-page', { pathRegex });
|
|
307
258
|
return {
|
|
308
|
-
|
|
259
|
+
templateName: 'wait-for-page',
|
|
260
|
+
data: { pathRegex },
|
|
309
261
|
comment: `Wait for page`,
|
|
310
262
|
};
|
|
311
263
|
},
|
|
312
|
-
priority: 9,
|
|
264
|
+
priority: 9,
|
|
313
265
|
},
|
|
314
266
|
{
|
|
315
267
|
name: 'wait-for-element-with-text',
|
|
@@ -317,7 +269,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
317
269
|
(step.text.includes('wait for') || step.text.includes('waits for')) &&
|
|
318
270
|
!!step.selectorRef &&
|
|
319
271
|
!!step.dataRef,
|
|
320
|
-
|
|
272
|
+
resolver: (step, context) => {
|
|
321
273
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
322
274
|
|
|
323
275
|
let dataValue: string;
|
|
@@ -329,15 +281,9 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
329
281
|
|
|
330
282
|
const state = extractWaitState(step.text);
|
|
331
283
|
|
|
332
|
-
const code = context.templateEngine.renderStep('wait-for-element-with-text', {
|
|
333
|
-
...resolved,
|
|
334
|
-
selectorRef: step.selectorRef,
|
|
335
|
-
dataValue,
|
|
336
|
-
state,
|
|
337
|
-
});
|
|
338
|
-
|
|
339
284
|
return {
|
|
340
|
-
|
|
285
|
+
templateName: 'wait-for-element-with-text',
|
|
286
|
+
data: { ...resolved, selectorRef: step.selectorRef, dataValue, state },
|
|
341
287
|
comment: `Wait for ${step.selectorRef} with ${step.dataRef} to be ${state}`,
|
|
342
288
|
};
|
|
343
289
|
},
|
|
@@ -347,22 +293,16 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
347
293
|
name: 'wait-for-element',
|
|
348
294
|
matcher: (step: ParsedStep) =>
|
|
349
295
|
(step.text.includes('wait for') || step.text.includes('waits for')) && !!step.selectorRef,
|
|
350
|
-
|
|
296
|
+
resolver: (step, context) => {
|
|
351
297
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
352
298
|
const state = extractWaitState(step.text);
|
|
353
299
|
|
|
354
|
-
const code = context.templateEngine.renderStep('wait-for-element', {
|
|
355
|
-
...resolved,
|
|
356
|
-
selectorRef: step.selectorRef,
|
|
357
|
-
state,
|
|
358
|
-
});
|
|
359
|
-
|
|
360
300
|
return {
|
|
361
|
-
|
|
301
|
+
templateName: 'wait-for-element',
|
|
302
|
+
data: { ...resolved, selectorRef: step.selectorRef, state },
|
|
362
303
|
comment: `Wait for ${step.selectorRef} to be ${state}`,
|
|
363
304
|
};
|
|
364
305
|
},
|
|
365
306
|
priority: 8,
|
|
366
307
|
},
|
|
367
308
|
];
|
|
368
|
-
|