pomwright 1.4.0 → 1.5.0

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 (117) hide show
  1. package/AGENTS.md +37 -0
  2. package/CHANGELOG.md +179 -0
  3. package/README.md +316 -34
  4. package/dist/index.d.mts +1052 -30
  5. package/dist/index.d.ts +1052 -30
  6. package/dist/index.js +2263 -65
  7. package/dist/index.mjs +2260 -67
  8. package/docs/v1-to-v2-migration/bridge-migration-guide.md +159 -0
  9. package/docs/v1-to-v2-migration/direct-migration-guide.md +238 -0
  10. package/docs/v1-to-v2-migration/v1-to-v2-comparison.md +547 -0
  11. package/docs/v2/PageObject.md +293 -0
  12. package/docs/v2/composing-locator-modules.md +93 -0
  13. package/docs/v2/locator-registry.md +693 -0
  14. package/docs/v2/logging.md +168 -0
  15. package/docs/v2/overview.md +515 -0
  16. package/docs/v2/session-storage.md +160 -0
  17. package/index.ts +61 -9
  18. package/intTestV2/.env +0 -0
  19. package/intTestV2/fixtures/testApp.fixtures.ts +43 -0
  20. package/intTestV2/package.json +22 -0
  21. package/intTestV2/page-object-models/testApp/pages/iframe/iframe.locatorSchema.ts +24 -0
  22. package/intTestV2/page-object-models/testApp/pages/iframe/iframe.page.ts +17 -0
  23. package/intTestV2/page-object-models/testApp/pages/testPage.locatorSchema.ts +32 -0
  24. package/intTestV2/page-object-models/testApp/pages/testPage.page.ts +119 -0
  25. package/intTestV2/page-object-models/testApp/pages/testPath/[color]/color.locatorSchema.ts +29 -0
  26. package/intTestV2/page-object-models/testApp/pages/testPath/[color]/color.page.ts +48 -0
  27. package/intTestV2/page-object-models/testApp/pages/testPath/testPath.locatorSchema.ts +9 -0
  28. package/intTestV2/page-object-models/testApp/pages/testPath/testPath.page.ts +23 -0
  29. package/intTestV2/page-object-models/testApp/pages/testfilters/testfilters.locatorSchema.ts +114 -0
  30. package/intTestV2/page-object-models/testApp/pages/testfilters/testfilters.page.ts +23 -0
  31. package/intTestV2/page-object-models/testApp/testApp.base.ts +20 -0
  32. package/intTestV2/playwright.config.ts +54 -0
  33. package/intTestV2/server.js +216 -0
  34. package/intTestV2/test-data/staticPage/index.html +280 -0
  35. package/intTestV2/test-data/staticPage/w3images/avatar2.png +0 -0
  36. package/intTestV2/test-data/staticPage/w3images/avatar3.png +0 -0
  37. package/intTestV2/test-data/staticPage/w3images/avatar5.png +0 -0
  38. package/intTestV2/test-data/staticPage/w3images/avatar6.png +0 -0
  39. package/intTestV2/test-data/staticPage/w3images/forest.jpg +0 -0
  40. package/intTestV2/test-data/staticPage/w3images/lights.jpg +0 -0
  41. package/intTestV2/test-data/staticPage/w3images/mountains.jpg +0 -0
  42. package/intTestV2/test-data/staticPage/w3images/nature.jpg +0 -0
  43. package/intTestV2/test-data/staticPage/w3images/snow.jpg +0 -0
  44. package/intTestV2/tests/locatorRegistry/add/add.describe.spec.ts +54 -0
  45. package/intTestV2/tests/locatorRegistry/add/add.filter.spec.ts +143 -0
  46. package/intTestV2/tests/locatorRegistry/add/add.frameLocator.spec.ts +23 -0
  47. package/intTestV2/tests/locatorRegistry/add/add.getByAltText.spec.ts +23 -0
  48. package/intTestV2/tests/locatorRegistry/add/add.getById.spec.ts +45 -0
  49. package/intTestV2/tests/locatorRegistry/add/add.getByLabel.spec.ts +23 -0
  50. package/intTestV2/tests/locatorRegistry/add/add.getByPlaceholder.spec.ts +23 -0
  51. package/intTestV2/tests/locatorRegistry/add/add.getByRole.spec.ts +23 -0
  52. package/intTestV2/tests/locatorRegistry/add/add.getByTestId.spec.ts +23 -0
  53. package/intTestV2/tests/locatorRegistry/add/add.getByText.spec.ts +23 -0
  54. package/intTestV2/tests/locatorRegistry/add/add.getByTitle.spec.ts +23 -0
  55. package/intTestV2/tests/locatorRegistry/add/add.locator.spec.ts +23 -0
  56. package/intTestV2/tests/locatorRegistry/add/add.reuseExisting.spec.ts +66 -0
  57. package/intTestV2/tests/locatorRegistry/add/add.reuseReusable.spec.ts +311 -0
  58. package/intTestV2/tests/locatorRegistry/add/add.spec.ts +159 -0
  59. package/intTestV2/tests/locatorRegistry/filter.cycle.spec.ts +39 -0
  60. package/intTestV2/tests/locatorRegistry/getLocator/getLocator.spec.ts +253 -0
  61. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.clearSteps.spec.ts +105 -0
  62. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.describe.spec.ts +23 -0
  63. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.filter.spec.ts +368 -0
  64. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.getLocator.spec.ts +56 -0
  65. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.getNestedLocator.spec.ts +175 -0
  66. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.nth.spec.ts +60 -0
  67. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.remove.spec.ts +32 -0
  68. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.replace.spec.ts +24 -0
  69. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.spec.ts +110 -0
  70. package/intTestV2/tests/locatorRegistry/getLocatorSchema/getLocatorSchema.update.spec.ts +322 -0
  71. package/intTestV2/tests/locatorRegistry/getNestedLocator/getNestedLocator.spec.ts +412 -0
  72. package/intTestV2/tests/locatorRegistry/registry/registry.binding.spec.ts +50 -0
  73. package/intTestV2/tests/locatorRegistry/validation/validation.locatorSchemaPath.spec.ts +115 -0
  74. package/intTestV2/tests/locatorRegistry/validation/validation.sub-path.spec.ts +45 -0
  75. package/intTestV2/tests/step/step.spec.ts +49 -0
  76. package/intTestV2/tests/testApp/color.spec.ts +15 -0
  77. package/intTestV2/tests/testApp/iframe.spec.ts +57 -0
  78. package/intTestV2/tests/testApp/testFilters.spec.ts +24 -0
  79. package/intTestV2/tests/testApp/testPage.spec.ts +161 -0
  80. package/intTestV2/tests/testApp/testPath.spec.ts +18 -0
  81. package/pack-build.sh +11 -0
  82. package/pack-test-v2.sh +36 -0
  83. package/package.json +10 -3
  84. package/playwright.base.ts +42 -0
  85. package/skills/README.md +56 -0
  86. package/skills/pomwright-v1-5-bridge-migration/SKILL.md +40 -0
  87. package/skills/pomwright-v1-5-bridge-migration/references/call-site-migration.md +178 -0
  88. package/skills/pomwright-v1-5-bridge-migration/references/schema-translation.md +183 -0
  89. package/skills/pomwright-v2-migration/SKILL.md +63 -0
  90. package/skills/pomwright-v2-migration/references/call-site-migration.md +265 -0
  91. package/skills/pomwright-v2-migration/references/class-migration.md +266 -0
  92. package/skills/pomwright-v2-migration/references/fixture-and-helpers.md +423 -0
  93. package/skills/pomwright-v2-migration/references/locator-registration.md +344 -0
  94. package/srcV2/fixture/base.fixtures.ts +23 -0
  95. package/srcV2/helpers/navigation.ts +153 -0
  96. package/srcV2/helpers/playwrightReportLogger.ts +196 -0
  97. package/srcV2/helpers/sessionStorage.ts +251 -0
  98. package/srcV2/helpers/stepDecorator.ts +106 -0
  99. package/srcV2/locators/index.ts +15 -0
  100. package/srcV2/locators/locatorQueryBuilder.ts +427 -0
  101. package/srcV2/locators/locatorRegistrationBuilder.ts +558 -0
  102. package/srcV2/locators/locatorRegistry.ts +541 -0
  103. package/srcV2/locators/locatorUpdateBuilder.ts +602 -0
  104. package/srcV2/locators/reusableLocatorBuilder.ts +200 -0
  105. package/srcV2/locators/types.ts +256 -0
  106. package/srcV2/locators/utils.ts +309 -0
  107. package/srcV2/locators/v1SchemaTranslator.ts +178 -0
  108. package/srcV2/pageObject.ts +105 -0
  109. /package/docs/{BaseApi-explanation.md → v1/BaseApi-explanation.md} +0 -0
  110. /package/docs/{BasePage-explanation.md → v1/BasePage-explanation.md} +0 -0
  111. /package/docs/{LocatorSchema-explanation.md → v1/LocatorSchema-explanation.md} +0 -0
  112. /package/docs/{LocatorSchemaPath-explanation.md → v1/LocatorSchemaPath-explanation.md} +0 -0
  113. /package/docs/{PlaywrightReportLogger-explanation.md → v1/PlaywrightReportLogger-explanation.md} +0 -0
  114. /package/docs/{get-locator-methods-explanation.md → v1/get-locator-methods-explanation.md} +0 -0
  115. /package/docs/{intro-to-using-pomwright.md → v1/intro-to-using-pomwright.md} +0 -0
  116. /package/docs/{sessionStorage-methods-explanation.md → v1/sessionStorage-methods-explanation.md} +0 -0
  117. /package/docs/{tips-folder-structure.md → v1/tips-folder-structure.md} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,8 +1,15 @@
1
1
  import * as _playwright_test from '@playwright/test';
2
- import { Page, Locator, TestInfo, Selectors, APIRequestContext } from '@playwright/test';
2
+ import { Page, Locator, TestInfo, APIRequestContext, Selectors, test as test$1 } from '@playwright/test';
3
3
 
4
+ /**
5
+ * @deprecated AriaRoleType will be removed in v2, see docs/v1-to-v2-migration
6
+ *
7
+ * Type representing the ARIA role of an element, used in the "role" property of the "LocatorSchema" interface. This type is derived from the parameters of Playwright's "page.getByRole" method, ensuring compatibility with Playwright's locator strategies.
8
+ */
4
9
  type AriaRoleType = Parameters<Page["getByRole"]>[0];
5
10
  /**
11
+ * @deprecated GetByMethod will be removed in v2, see docs/v1-to-v2-migration
12
+ *
6
13
  * ENUM representing methods from the "GetBy" helper class, used by the "GetLocatorBase" class when building nested locators
7
14
  */
8
15
  declare enum GetByMethod {
@@ -19,6 +26,8 @@ declare enum GetByMethod {
19
26
  id = "id"
20
27
  }
21
28
  /**
29
+ * @deprecated LocatorSchema will be removed in v2, see docs/v1-to-v2-migration
30
+ *
22
31
  * An interface representing a locator object, which can be used with Playwright or other automation tools to create a reusable and maintainable "library" of Locator objects.
23
32
  *
24
33
  * To make tests resilient, prioritize user-facing attributes and explicit contracts such as role locators (ARIA).
@@ -125,7 +134,7 @@ type LogEntry = {
125
134
  * PlaywrightReportLogger is a logger implementation designed for Playwright tests.
126
135
  * It records log messages and attaches them to the Playwright HTML report.
127
136
  *
128
- * The logger enables all fixtures implementing it to share the same log level
137
+ * The logger enables all fixtures implementing a child logger to share the same log level
129
138
  * within the scope of a single test, independant of other tests run in parallell.
130
139
  * In the same way each fixture will share a single logEntry for recording all log
131
140
  * statements produced throughout the tests execution, when the test is done, all log
@@ -134,8 +143,8 @@ type LogEntry = {
134
143
  * Log messages can be recorded with various log levels (debug, info, warn, error).
135
144
  *
136
145
  * The getNewChildLogger method allows you to create a new 'child' logger instance
137
- * with a new contextual name (e.g. the class it's used), while sharing the logLevel
138
- * and LogEntry with the 'parent'.
146
+ * with a new contextual name (e.g. the class it's used in), while sharing the logLevel
147
+ * and LogEntry with the 'parent' fixture.
139
148
  *
140
149
  * @example
141
150
  * 20:49:50 05.05.2023 - DEBUG : [TestCase]
@@ -210,6 +219,18 @@ declare class PlaywrightReportLogger {
210
219
  attachLogsToTest(testInfo: TestInfo): void;
211
220
  }
212
221
 
222
+ /**
223
+ * @deprecated BaseApi will be removed in v2, see docs/v1-to-v2-migration
224
+ * Please use your own API base class implementation and do not rely on this class.
225
+ */
226
+ declare class BaseApi {
227
+ protected baseUrl: string;
228
+ apiName: string;
229
+ protected log: PlaywrightReportLogger;
230
+ protected request: APIRequestContext;
231
+ constructor(baseUrl: string, apiName: string, context: APIRequestContext, pwrl: PlaywrightReportLogger);
232
+ }
233
+
213
234
  /**
214
235
  * The GetBy class encapsulates methods for generating and obtaining Playwright Locators using LocatorSchema.
215
236
  * It maps locator methods to corresponding Playwright page functions and provides a convenient interface to interact
@@ -285,7 +306,7 @@ type FilterEntry = {
285
306
  * For example: ExtractSubPaths<"body.section@playground.button@reset"> produces:
286
307
  * "body" | "body.section@playground" | "body.section@playground.button@reset"
287
308
  */
288
- type ExtractSubPaths<Path extends string> = Path extends `${infer Head}.${infer Tail}` ? Head | `${Head}.${ExtractSubPaths<Tail>}` : Path;
309
+ type ExtractSubPaths$1<Path extends string> = Path extends `${infer Head}.${infer Tail}` ? Head | `${Head}.${ExtractSubPaths$1<Tail>}` : Path;
289
310
  /**
290
311
  * SubPaths computes valid sub-paths for a given chosen substring (LocatorSubstring).
291
312
  * If LocatorSubstring is a string:
@@ -294,8 +315,10 @@ type ExtractSubPaths<Path extends string> = Path extends `${infer Head}.${infer
294
315
  * SubPaths returns only "body", "body.section@playground", and "body.section@playground.button@reset"
295
316
  * from the entire union of LocatorSchemaPathType, if they exist.
296
317
  */
297
- type SubPaths<LocatorSchemaPathType extends string, LocatorSubstring extends LocatorSchemaPathType | undefined> = LocatorSubstring extends string ? Extract<LocatorSchemaPathType, LocatorSubstring | ExtractSubPaths<LocatorSubstring>> : never;
318
+ type SubPaths<LocatorSchemaPathType extends string, LocatorSubstring extends LocatorSchemaPathType | undefined> = LocatorSubstring extends string ? Extract<LocatorSchemaPathType, LocatorSubstring | ExtractSubPaths$1<LocatorSubstring>> : never;
298
319
  /**
320
+ * @deprecated LocatorSchemaWithMethods will be replaced by LocatorRegistry.createReusable in v2, see docs/v1-to-v2-migration
321
+ *
299
322
  * UpdatableLocatorSchemaProperties represent the properties of LocatorSchema that can be changed by update,
300
323
  * excluding the locatorSchemaPath itself, which remains immutable.
301
324
  */
@@ -308,7 +331,7 @@ type PathIndexPairs = {
308
331
  /**
309
332
  * Ensures LocatorSchemaPath strings are non-empty, do not start/end with dots, and avoid consecutive dots.
310
333
  */
311
- type LocatorSchemaPathValid<Path extends string> = Path extends "" ? never : Path extends `.${string}` | `${string}.` ? never : Path extends `${string}..${string}` ? never : Path;
334
+ type LocatorSchemaPathValid$1<Path extends string> = Path extends "" ? never : Path extends `.${string}` | `${string}.` ? never : Path extends `${string}..${string}` ? never : Path;
312
335
  /**
313
336
  * LocatorSchemaWithMethods is the type returned by getLocatorSchema. It merges LocatorSchema with chainable methods:
314
337
  * - update: Modify any properties of any LocatorSchema in the chain that make up the LocatorSchemaPath. Can be chained multiple times, applies updates in the order chained.
@@ -454,6 +477,8 @@ type LocatorSchemaWithMethods<LocatorSchemaPathType extends string, LocatorSubst
454
477
  getLocator(): Promise<Locator>;
455
478
  };
456
479
  /**
480
+ * @deprecated GetLocatorBase will be replaced by LocatorRegistry in v2, see docs/v1-to-v2-migration
481
+ *
457
482
  * GetLocatorBase:
458
483
  * The foundational class for managing and constructing nested locators based on LocatorSchemas.
459
484
  *
@@ -476,12 +501,12 @@ type LocatorSchemaWithMethods<LocatorSchemaPathType extends string, LocatorSubst
476
501
  * Assembles nested Playwright locators step-by-step according to the path.
477
502
  */
478
503
  declare class GetLocatorBase<LocatorSchemaPathType extends string, LocatorSubstring extends LocatorSchemaPathType | undefined = undefined> {
479
- protected pageObjectClass: BasePage<LocatorSchemaPathType, BasePageOptions, LocatorSubstring>;
504
+ protected pageObjectClass: BasePage<LocatorSchemaPathType, BasePageOptions$1, LocatorSubstring>;
480
505
  protected log: PlaywrightReportLogger;
481
506
  protected locatorSubstring?: LocatorSubstring | undefined;
482
507
  getBy: GetBy;
483
508
  private locatorSchemas;
484
- constructor(pageObjectClass: BasePage<LocatorSchemaPathType, BasePageOptions, LocatorSubstring>, log: PlaywrightReportLogger, locatorSubstring?: LocatorSubstring | undefined);
509
+ constructor(pageObjectClass: BasePage<LocatorSchemaPathType, BasePageOptions$1, LocatorSubstring>, log: PlaywrightReportLogger, locatorSubstring?: LocatorSubstring | undefined);
485
510
  /**
486
511
  * getLocatorSchema:
487
512
  * Given a path P, we:
@@ -513,7 +538,7 @@ declare class GetLocatorBase<LocatorSchemaPathType extends string, LocatorSubstr
513
538
  * Registers a new LocatorSchema under the given locatorSchemaPath.
514
539
  * Throws an error if a schema already exists at that path.
515
540
  */
516
- addSchema(locatorSchemaPath: LocatorSchemaPathType & LocatorSchemaPathValid<LocatorSchemaPathType>, schemaDetails: LocatorSchemaWithoutPath): void;
541
+ addSchema(locatorSchemaPath: LocatorSchemaPathType & LocatorSchemaPathValid$1<LocatorSchemaPathType>, schemaDetails: LocatorSchemaWithoutPath): void;
517
542
  /**
518
543
  * safeGetLocatorSchema:
519
544
  * Safely retrieves a schema function if available for the given path.
@@ -554,7 +579,7 @@ declare class GetLocatorBase<LocatorSchemaPathType extends string, LocatorSubstr
554
579
  * Defines the SessionStorage class to manage session storage in Playwright.
555
580
  * It provides methods to set, get, and clear session storage data, and to handle data before page navigation.
556
581
  */
557
- declare class SessionStorage {
582
+ declare class SessionStorage$1 {
558
583
  private page;
559
584
  private pocName;
560
585
  private queuedStates;
@@ -609,27 +634,40 @@ declare class SessionStorage {
609
634
  }
610
635
 
611
636
  /**
637
+ * @deprecated BasePageOptions will be removed in v2, see docs/v1-to-v2-migration
638
+ *
612
639
  * BasePageOptions can define optional patterns for baseUrl and urlPath.
613
640
  * Defaults assume they are strings if not specified.
614
641
  */
615
- type BasePageOptions = {
642
+ type BasePageOptions$1 = {
616
643
  urlOptions?: {
617
644
  baseUrlType?: string | RegExp;
618
645
  urlPathType?: string | RegExp;
619
646
  };
620
647
  };
621
- type ExtractBaseUrlType<T extends BasePageOptions> = T["urlOptions"] extends {
648
+ /**
649
+ * @deprecated ExtractBaseUrlType will be replaced by BaseUrlTypeFromOptions in v2, see docs/v1-to-v2-migration
650
+ */
651
+ type ExtractBaseUrlType$1<T extends BasePageOptions$1> = T["urlOptions"] extends {
622
652
  baseUrlType: RegExp;
623
653
  } ? RegExp : string;
624
- type ExtractUrlPathType<T extends BasePageOptions> = T["urlOptions"] extends {
654
+ /**
655
+ * @deprecated ExtractUrlPathType will be replaced by UrlPathTypeFromOptions in v2, see docs/v1-to-v2-migration
656
+ */
657
+ type ExtractUrlPathType$1<T extends BasePageOptions$1> = T["urlOptions"] extends {
625
658
  urlPathType: RegExp;
626
659
  } ? RegExp : string;
627
- type ExtractFullUrlType<T extends BasePageOptions> = T["urlOptions"] extends {
660
+ /**
661
+ * @deprecated ExtractFullUrlType will be replaced by FullUrlTypeFromOptions in v2, see docs/v1-to-v2-migration
662
+ */
663
+ type ExtractFullUrlType$1<T extends BasePageOptions$1> = T["urlOptions"] extends {
628
664
  baseUrlType: RegExp;
629
665
  } | {
630
666
  urlPathType: RegExp;
631
667
  } ? RegExp : string;
632
668
  /**
669
+ * @deprecated BasePage will be replaced by PageObject in v2, see docs/v1-to-v2-migration.
670
+ *
633
671
  * BasePage:
634
672
  * The foundational class for all Page Object Classes.
635
673
  *
@@ -646,7 +684,7 @@ type ExtractFullUrlType<T extends BasePageOptions> = T["urlOptions"] extends {
646
684
  * - getNestedLocator & getLocator methods that delegate to getLocatorSchema.
647
685
  * - Abstract initLocatorSchemas method to be implemented by concrete POCs.
648
686
  */
649
- declare abstract class BasePage<LocatorSchemaPathType extends string, Options extends BasePageOptions = {
687
+ declare abstract class BasePage<LocatorSchemaPathType extends string, Options extends BasePageOptions$1 = {
650
688
  urlOptions: {
651
689
  baseUrlType: string;
652
690
  urlPathType: string;
@@ -659,17 +697,17 @@ declare abstract class BasePage<LocatorSchemaPathType extends string, Options ex
659
697
  /** Selectors can be used to install custom selector engines.*/
660
698
  selector: Selectors;
661
699
  /** The base URL of the Page Object Class */
662
- baseUrl: ExtractBaseUrlType<Options>;
700
+ baseUrl: ExtractBaseUrlType$1<Options>;
663
701
  /** The URL path of the Page Object Class */
664
- urlPath: ExtractUrlPathType<Options>;
702
+ urlPath: ExtractUrlPathType$1<Options>;
665
703
  /** The full URL of the Page Object Class */
666
- fullUrl: ExtractFullUrlType<Options>;
704
+ fullUrl: ExtractFullUrlType$1<Options>;
667
705
  /** The name of the Page Object Class */
668
706
  pocName: string;
669
707
  /** The Page Object Class' PlaywrightReportLogger instance, prefixed with its name. Log levels: debug, info, warn, and error. */
670
708
  protected log: PlaywrightReportLogger;
671
709
  /** The SessionStorage class provides methods for setting and getting session storage data in Playwright.*/
672
- sessionStorage: SessionStorage;
710
+ sessionStorage: SessionStorage$1;
673
711
  /**
674
712
  * locators:
675
713
  * An instance of GetLocatorBase that handles schema management and provides getLocatorSchema calls.
@@ -677,7 +715,7 @@ declare abstract class BasePage<LocatorSchemaPathType extends string, Options ex
677
715
  * we get a chainable object typed with LocatorSubstring = P.
678
716
  */
679
717
  protected locators: GetLocatorBase<LocatorSchemaPathType, LocatorSubstring>;
680
- constructor(page: Page, testInfo: TestInfo, baseUrl: ExtractBaseUrlType<Options>, urlPath: ExtractUrlPathType<Options>, pocName: string, pwrl: PlaywrightReportLogger, locatorSubstring?: LocatorSubstring);
718
+ constructor(page: Page, testInfo: TestInfo, baseUrl: ExtractBaseUrlType$1<Options>, urlPath: ExtractUrlPathType$1<Options>, pocName: string, pwrl: PlaywrightReportLogger, locatorSubstring?: LocatorSubstring);
681
719
  /**
682
720
  * constructFullUrl:
683
721
  * Combines baseUrl and urlPath, handling both strings and RegExps.
@@ -862,17 +900,1001 @@ declare abstract class BasePage<LocatorSchemaPathType extends string, Options ex
862
900
  protected abstract initLocatorSchemas(): void;
863
901
  }
864
902
 
865
- type baseFixtures = {
866
- log: PlaywrightReportLogger;
903
+ type UnicodeWhitespaceChar = "\u0009" | "\u000A" | "\u000B" | "\u000C" | "\u000D" | "\u0020" | "\u0085" | "\u00A0" | "\u1680" | "\u2000" | "\u2001" | "\u2002" | "\u2003" | "\u2004" | "\u2005" | "\u2006" | "\u2007" | "\u2008" | "\u2009" | "\u200A" | "\u2028" | "\u2029" | "\u202F" | "\u205F" | "\u3000";
904
+ type LocatorSchemaPathError<S extends string, Reason extends string> = [
905
+ "Invalid locator schema path",
906
+ Reason,
907
+ S
908
+ ];
909
+ type LocatorSchemaPathFormat<S extends string> = string extends S ? S : S extends "" ? LocatorSchemaPathError<S, "String can't be empty"> : _LocatorSchemaPathFormat<S, S, true, false>;
910
+ type _LocatorSchemaPathFormat<Original extends string, Rest extends string, AtStart extends boolean, PrevDot extends boolean> = Rest extends "" ? PrevDot extends true ? LocatorSchemaPathError<Original, "String can't end with '.'"> : Original : Rest extends `${infer C}${infer Tail}` ? C extends UnicodeWhitespaceChar ? LocatorSchemaPathError<Original, "String can't contain whitespace chars"> : C extends "." ? AtStart extends true ? LocatorSchemaPathError<Original, "String can't start with '.'"> : PrevDot extends true ? LocatorSchemaPathError<Original, "String can't contain consecutive '.'"> : _LocatorSchemaPathFormat<Original, Tail, false, true> : _LocatorSchemaPathFormat<Original, Tail, false, false> : never;
911
+ type LocatorSchemaPathValid<Path extends string> = Path extends unknown ? LocatorSchemaPathFormat<Path> extends Path ? Path : never : never;
912
+ type RegistryPath<LocatorSchemaPathType extends string> = LocatorSchemaPathType & LocatorSchemaPathValid<LocatorSchemaPathType>;
913
+ type ExtractSubPaths<Path extends string> = Path extends `${infer Head}.${infer Tail}` ? Head | `${Head}.${ExtractSubPaths<Tail>}` : Path;
914
+ type LocatorChainPaths<LocatorSchemaPathType extends string, LocatorSubstring extends LocatorSchemaPathType | undefined> = LocatorSubstring extends string ? Extract<LocatorSchemaPathType, LocatorSubstring | ExtractSubPaths<LocatorSubstring>> : never;
915
+ type LocatorSchemaPathAlias<LocatorSchemaPathType extends string> = LocatorSchemaPathType & LocatorSchemaPathValid<LocatorSchemaPathType>;
916
+ type RoleDefinition = {
917
+ type: "role";
918
+ role: Parameters<Page["getByRole"]>[0];
919
+ options?: Parameters<Page["getByRole"]>[1];
920
+ };
921
+ type TextDefinition = {
922
+ type: "text";
923
+ text: Parameters<Page["getByText"]>[0];
924
+ options?: Parameters<Page["getByText"]>[1];
925
+ };
926
+ type LabelDefinition = {
927
+ type: "label";
928
+ text: Parameters<Page["getByLabel"]>[0];
929
+ options?: Parameters<Page["getByLabel"]>[1];
930
+ };
931
+ type PlaceholderDefinition = {
932
+ type: "placeholder";
933
+ text: Parameters<Page["getByPlaceholder"]>[0];
934
+ options?: Parameters<Page["getByPlaceholder"]>[1];
935
+ };
936
+ type AltTextDefinition = {
937
+ type: "altText";
938
+ text: Parameters<Page["getByAltText"]>[0];
939
+ options?: Parameters<Page["getByAltText"]>[1];
940
+ };
941
+ type TitleDefinition = {
942
+ type: "title";
943
+ text: Parameters<Page["getByTitle"]>[0];
944
+ options?: Parameters<Page["getByTitle"]>[1];
945
+ };
946
+ type LocatorDefinition = {
947
+ type: "locator";
948
+ selector: Parameters<Page["locator"]>[0];
949
+ options?: Parameters<Page["locator"]>[1];
950
+ };
951
+ type FrameLocatorDefinition = {
952
+ type: "frameLocator";
953
+ selector: Parameters<Page["frameLocator"]>[0];
954
+ };
955
+ type TestIdDefinition = {
956
+ type: "testId";
957
+ testId: Parameters<Page["getByTestId"]>[0];
958
+ };
959
+ type IdDefinition = {
960
+ type: "id";
961
+ id: string | RegExp;
867
962
  };
868
- declare const test: _playwright_test.TestType<_playwright_test.PlaywrightTestArgs & _playwright_test.PlaywrightTestOptions & baseFixtures, _playwright_test.PlaywrightWorkerArgs & _playwright_test.PlaywrightWorkerOptions>;
963
+ type LocatorStrategyDefinition = RoleDefinition | TextDefinition | LabelDefinition | PlaceholderDefinition | AltTextDefinition | TitleDefinition | LocatorDefinition | FrameLocatorDefinition | TestIdDefinition | IdDefinition;
964
+ type PlaywrightFilterDefinition = NonNullable<Parameters<Locator["filter"]>[0]>;
965
+ type ResolvedFilterDefinition = PlaywrightFilterDefinition;
966
+ type LocatorDescription = Parameters<Locator["describe"]>[0];
967
+ type LocatorStep<LocatorSchemaPathType extends string = string, AllowedPaths extends string = LocatorSchemaPathAlias<LocatorSchemaPathType>> = {
968
+ kind: "filter";
969
+ filter: FilterDefinition<LocatorSchemaPathType, AllowedPaths>;
970
+ } | {
971
+ kind: "index";
972
+ index: IndexSelector | null;
973
+ };
974
+ type ReusableLocator<LocatorSchemaPathType extends string = string, AllowedPaths extends string = LocatorSchemaPathAlias<LocatorSchemaPathType>, Type extends LocatorStrategyDefinition["type"] = LocatorStrategyDefinition["type"]> = {
975
+ type: Type;
976
+ definition: Extract<LocatorStrategyDefinition, {
977
+ type: Type;
978
+ }>;
979
+ steps: LocatorStep<LocatorSchemaPathType, AllowedPaths>[];
980
+ description?: LocatorDescription;
981
+ };
982
+ type FilterLocatorReference<LocatorSchemaPathType extends string, AllowedPaths extends string = LocatorSchemaPathAlias<LocatorSchemaPathType>> = Locator | AllowedPaths;
983
+ type FilterDefinition<LocatorSchemaPathType extends string, AllowedPaths extends string = LocatorSchemaPathAlias<LocatorSchemaPathType>> = PlaywrightFilterDefinition | (Omit<PlaywrightFilterDefinition, "has" | "hasNot"> & {
984
+ has?: PlaywrightFilterDefinition["has"] | FilterLocatorReference<LocatorSchemaPathType, AllowedPaths>;
985
+ hasNot?: PlaywrightFilterDefinition["hasNot"] | FilterLocatorReference<LocatorSchemaPathType, AllowedPaths>;
986
+ });
987
+ type LocatorSchemaRecord<LocatorSchemaPathType extends string = string, AllowedPaths extends string = LocatorSchemaPathAlias<LocatorSchemaPathType>> = {
988
+ locatorSchemaPath: LocatorSchemaPathAlias<LocatorSchemaPathType>;
989
+ definition: LocatorStrategyDefinition;
990
+ steps?: LocatorStep<LocatorSchemaPathType, AllowedPaths>[];
991
+ description?: LocatorDescription;
992
+ };
993
+ type LocatorUpdateFor<Definition extends LocatorStrategyDefinition> = {
994
+ type: Definition["type"];
995
+ } & Partial<Omit<Definition, "type">>;
996
+ type LocatorUpdate = LocatorUpdateFor<RoleDefinition> | LocatorUpdateFor<TextDefinition> | LocatorUpdateFor<LabelDefinition> | LocatorUpdateFor<PlaceholderDefinition> | LocatorUpdateFor<AltTextDefinition> | LocatorUpdateFor<TitleDefinition> | LocatorUpdateFor<LocatorDefinition> | LocatorUpdateFor<FrameLocatorDefinition> | LocatorUpdateFor<TestIdDefinition> | LocatorUpdateFor<IdDefinition>;
997
+ type IndexSelector = number | "first" | "last";
869
998
 
870
- declare class BaseApi {
871
- protected baseUrl: string;
872
- apiName: string;
999
+ type LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType extends string, Path extends RegistryPath<LocatorSchemaPathType>> = {
1000
+ filter: (filter: FilterDefinition<RegistryPath<LocatorSchemaPathType>, RegistryPath<LocatorSchemaPathType>>) => LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1001
+ nth: (index: IndexSelector) => LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1002
+ describe: (description: LocatorDescription) => LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1003
+ };
1004
+ declare class LocatorRegistrationBuilder<LocatorSchemaPathType extends string, Path extends RegistryPath<LocatorSchemaPathType>, Seeded extends boolean = false> {
1005
+ private readonly registry;
1006
+ private readonly path;
1007
+ private steps;
1008
+ private definition?;
1009
+ private description?;
1010
+ private registered;
1011
+ private readonly reuseType?;
1012
+ private readonly seededDefinition;
1013
+ private overrideApplied;
1014
+ private postDefinitionView?;
1015
+ constructor(registry: LocatorRegistryInternal<LocatorSchemaPathType>, path: Path, seed?: {
1016
+ initialDefinition?: LocatorStrategyDefinition;
1017
+ initialSteps?: LocatorStep<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>>[];
1018
+ reuseType?: LocatorStrategyDefinition["type"];
1019
+ initialDescription?: LocatorDescription;
1020
+ });
1021
+ persistSeededDefinition(): this;
1022
+ /**
1023
+ * Records a Playwright-style filter on the locator being registered. Filters are applied in the
1024
+ * order they are chained and can include `has`/`hasNot` locator references. Requires that a
1025
+ * locator strategy has already been set for this registration.
1026
+ *
1027
+ * @example
1028
+ * ```ts
1029
+ * registry.add("list.item").locator("li").filter({ hasText: /Row/ });
1030
+ * ```
1031
+ */
1032
+ filter(filter: FilterDefinition<RegistryPath<LocatorSchemaPathType>, RegistryPath<LocatorSchemaPathType>>): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1033
+ /**
1034
+ * Adds an index selector for the locator being registered. Indices are applied in the order they
1035
+ * are chained and require a locator definition to have been set first.
1036
+ *
1037
+ * @example
1038
+ * ```ts
1039
+ * registry.add("table.rows").locator("tr").nth(0);
1040
+ * ```
1041
+ */
1042
+ nth(index: IndexSelector): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1043
+ describe(description: LocatorDescription): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1044
+ /**
1045
+ * Uses Playwright `getByRole` semantics to define the locator strategy. Accepts a role and
1046
+ * optional options; when seeded via `{ reuse }`, an options-only call patches the seeded role.
1047
+ *
1048
+ * @example
1049
+ * ```ts
1050
+ * registry.add("nav.home").getByRole("link", { name: "Home" });
1051
+ * ```
1052
+ */
1053
+ getByRole(role: RoleDefinition["role"], options: RoleDefinition["options"]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1054
+ getByRole(role: RoleDefinition["role"]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1055
+ getByRole(options: Seeded extends true ? RoleDefinition["options"] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1056
+ /**
1057
+ * Uses Playwright `getByText` semantics to define the locator strategy. Accepts string/RegExp
1058
+ * text and optional options; when seeded, an options-only call patches the seeded text.
1059
+ *
1060
+ * @example
1061
+ * ```ts
1062
+ * registry.add("alert.error").getByText(/failed/i);
1063
+ * ```
1064
+ */
1065
+ getByText(text: Parameters<Page["getByText"]>[0], options: Parameters<Page["getByText"]>[1]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1066
+ getByText(text: Parameters<Page["getByText"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1067
+ getByText(options: Seeded extends true ? Parameters<Page["getByText"]>[1] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1068
+ /**
1069
+ * Uses Playwright `getByLabel` semantics to define the locator strategy. Accepts label text and
1070
+ * optional options; when seeded, an options-only call patches the seeded text.
1071
+ *
1072
+ * @example
1073
+ * ```ts
1074
+ * registry.add("form.email").getByLabel("Email", { exact: true });
1075
+ * ```
1076
+ */
1077
+ getByLabel(text: Parameters<Page["getByLabel"]>[0], options: Parameters<Page["getByLabel"]>[1]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1078
+ getByLabel(text: Parameters<Page["getByLabel"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1079
+ getByLabel(options: Seeded extends true ? Parameters<Page["getByLabel"]>[1] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1080
+ /**
1081
+ * Uses Playwright `getByPlaceholder` semantics to define the locator strategy. Accepts placeholder
1082
+ * text and optional options; when seeded, an options-only call patches the seeded text.
1083
+ *
1084
+ * @example
1085
+ * ```ts
1086
+ * registry.add("form.search").getByPlaceholder("Search", { exact: true });
1087
+ * ```
1088
+ */
1089
+ getByPlaceholder(text: Parameters<Page["getByPlaceholder"]>[0], options: Parameters<Page["getByPlaceholder"]>[1]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1090
+ getByPlaceholder(text: Parameters<Page["getByPlaceholder"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1091
+ getByPlaceholder(options: Seeded extends true ? Parameters<Page["getByPlaceholder"]>[1] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1092
+ /**
1093
+ * Uses Playwright `getByAltText` semantics to define the locator strategy. Accepts alt text and
1094
+ * optional options; when seeded, an options-only call patches the seeded text.
1095
+ *
1096
+ * @example
1097
+ * ```ts
1098
+ * registry.add("image.logo").getByAltText(/brand/);
1099
+ * ```
1100
+ */
1101
+ getByAltText(text: Parameters<Page["getByAltText"]>[0], options: Parameters<Page["getByAltText"]>[1]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1102
+ getByAltText(text: Parameters<Page["getByAltText"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1103
+ getByAltText(options: Seeded extends true ? Parameters<Page["getByAltText"]>[1] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1104
+ /**
1105
+ * Uses Playwright `getByTitle` semantics to define the locator strategy. Accepts title text and
1106
+ * optional options; when seeded, an options-only call patches the seeded text.
1107
+ *
1108
+ * @example
1109
+ * ```ts
1110
+ * registry.add("icon.info").getByTitle("Info");
1111
+ * ```
1112
+ */
1113
+ getByTitle(text: Parameters<Page["getByTitle"]>[0], options: Parameters<Page["getByTitle"]>[1]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1114
+ getByTitle(text: Parameters<Page["getByTitle"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1115
+ getByTitle(options: Seeded extends true ? Parameters<Page["getByTitle"]>[1] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1116
+ /**
1117
+ * Uses Playwright `locator` semantics to define the locator strategy. Accepts a selector and
1118
+ * optional options; when seeded, an options-only call patches the seeded selector by merging
1119
+ * options while inheriting the selector.
1120
+ *
1121
+ * @example
1122
+ * ```ts
1123
+ * registry.add("list.items").locator("ul > li");
1124
+ * ```
1125
+ */
1126
+ locator(selector: Parameters<Page["locator"]>[0], options: Parameters<Page["locator"]>[1]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1127
+ locator(selector: Parameters<Page["locator"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1128
+ locator(options: Seeded extends true ? Parameters<Page["locator"]>[1] : never): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1129
+ /**
1130
+ * Uses Playwright `frameLocator` semantics to define the locator strategy, entering the targeted
1131
+ * frame for subsequent chained locators. When seeded, `selector` may be omitted to retain the
1132
+ * existing selector while overriding options elsewhere.
1133
+ *
1134
+ * @example
1135
+ * ```ts
1136
+ * registry.add("frame.login").frameLocator("iframe.auth");
1137
+ * ```
1138
+ */
1139
+ frameLocator(selector: Seeded extends true ? Parameters<Page["frameLocator"]>[0] | undefined : Parameters<Page["frameLocator"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1140
+ /**
1141
+ * Uses Playwright `getByTestId` semantics to define the locator strategy. When seeded, omitting
1142
+ * the argument inherits the seeded `testId` while allowing options from other overrides.
1143
+ *
1144
+ * @example
1145
+ * ```ts
1146
+ * registry.add("card.title").getByTestId("card-title");
1147
+ * ```
1148
+ */
1149
+ getByTestId(testId: Seeded extends true ? Parameters<Page["getByTestId"]>[0] | undefined : Parameters<Page["getByTestId"]>[0]): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1150
+ /**
1151
+ * Targets elements by `id`, normalizing string or RegExp input. When seeded, the argument can be
1152
+ * omitted to inherit the seeded id.
1153
+ *
1154
+ * @example
1155
+ * ```ts
1156
+ * registry.add("modal.close").getById("close-modal");
1157
+ * ```
1158
+ */
1159
+ getById(id: Seeded extends true ? string | RegExp | undefined : string | RegExp): LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path>;
1160
+ private commit;
1161
+ private applyFilter;
1162
+ private applyIndex;
1163
+ private ensureDefinitionAllowedWithRollback;
1164
+ private ensureDefinition;
1165
+ private persist;
1166
+ private rollbackSeededRegistration;
1167
+ private getPostDefinitionView;
1168
+ }
1169
+ type LocatorRegistrationPreDefinitionBuilder<LocatorSchemaPathType extends string, Path extends RegistryPath<LocatorSchemaPathType>, Seeded extends boolean = false> = LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path> & Pick<LocatorRegistrationBuilder<LocatorSchemaPathType, Path, Seeded>, "getByRole" | "getByText" | "getByLabel" | "getByPlaceholder" | "getByAltText" | "getByTitle" | "locator" | "frameLocator" | "getByTestId" | "getById">;
1170
+ type LocatorMethodForType<Type extends LocatorStrategyDefinition["type"]> = Type extends "role" ? "getByRole" : Type extends "text" ? "getByText" : Type extends "label" ? "getByLabel" : Type extends "placeholder" ? "getByPlaceholder" : Type extends "altText" ? "getByAltText" : Type extends "title" ? "getByTitle" : Type extends "locator" ? "locator" : Type extends "frameLocator" ? "frameLocator" : Type extends "testId" ? "getByTestId" : Type extends "id" ? "getById" : never;
1171
+ type LocatorRegistrationSeededBuilderForType<LocatorSchemaPathType extends string, Path extends RegistryPath<LocatorSchemaPathType>, SeededType extends LocatorStrategyDefinition["type"]> = LocatorRegistrationPostDefinitionBuilder<LocatorSchemaPathType, Path> & Pick<LocatorRegistrationBuilder<LocatorSchemaPathType, Path, true>, LocatorMethodForType<SeededType>>;
1172
+
1173
+ declare class ReusableLocatorBuilder<LocatorSchemaPathType extends string, AllowedPaths extends string = RegistryPath<LocatorSchemaPathType>, Type extends LocatorStrategyDefinition["type"] = LocatorStrategyDefinition["type"]> implements ReusableLocator<LocatorSchemaPathType, AllowedPaths, Type> {
1174
+ private readonly stepsList;
1175
+ private readonly definitionValue;
1176
+ private descriptionValue?;
1177
+ readonly type: Type;
1178
+ constructor(definition: Extract<LocatorStrategyDefinition, {
1179
+ type: Type;
1180
+ }>, steps?: LocatorStep<LocatorSchemaPathType, AllowedPaths>[]);
1181
+ filter(filter: FilterDefinition<RegistryPath<LocatorSchemaPathType>, AllowedPaths>): this;
1182
+ nth(index: IndexSelector): this;
1183
+ describe(description: LocatorDescription): this;
1184
+ get definition(): Extract<RoleDefinition, {
1185
+ type: Type;
1186
+ }> | Extract<TextDefinition, {
1187
+ type: Type;
1188
+ }> | Extract<LabelDefinition, {
1189
+ type: Type;
1190
+ }> | Extract<PlaceholderDefinition, {
1191
+ type: Type;
1192
+ }> | Extract<AltTextDefinition, {
1193
+ type: Type;
1194
+ }> | Extract<TitleDefinition, {
1195
+ type: Type;
1196
+ }> | Extract<LocatorDefinition, {
1197
+ type: Type;
1198
+ }> | Extract<FrameLocatorDefinition, {
1199
+ type: Type;
1200
+ }> | Extract<TestIdDefinition, {
1201
+ type: Type;
1202
+ }> | Extract<IdDefinition, {
1203
+ type: Type;
1204
+ }>;
1205
+ get steps(): ({
1206
+ kind: "index";
1207
+ index: IndexSelector | null;
1208
+ } | {
1209
+ kind: "filter";
1210
+ filter: FilterDefinition<LocatorSchemaPathType, AllowedPaths>;
1211
+ })[];
1212
+ get description(): string | undefined;
1213
+ }
1214
+ declare class ReusableLocatorFactory<LocatorSchemaPathType extends string> {
1215
+ getByRole(role: RoleDefinition["role"], options: RoleDefinition["options"]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "role">;
1216
+ getByRole(role: RoleDefinition["role"]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "role">;
1217
+ getByText(text: Parameters<Page["getByText"]>[0], options: Parameters<Page["getByText"]>[1]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "text">;
1218
+ getByText(text: Parameters<Page["getByText"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "text">;
1219
+ getByLabel(text: Parameters<Page["getByLabel"]>[0], options: Parameters<Page["getByLabel"]>[1]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "label">;
1220
+ getByLabel(text: Parameters<Page["getByLabel"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "label">;
1221
+ getByPlaceholder(text: Parameters<Page["getByPlaceholder"]>[0], options: Parameters<Page["getByPlaceholder"]>[1]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "placeholder">;
1222
+ getByPlaceholder(text: Parameters<Page["getByPlaceholder"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "placeholder">;
1223
+ getByAltText(text: Parameters<Page["getByAltText"]>[0], options: Parameters<Page["getByAltText"]>[1]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "altText">;
1224
+ getByAltText(text: Parameters<Page["getByAltText"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "altText">;
1225
+ getByTitle(text: Parameters<Page["getByTitle"]>[0], options: Parameters<Page["getByTitle"]>[1]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "title">;
1226
+ getByTitle(text: Parameters<Page["getByTitle"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "title">;
1227
+ locator(selector: Parameters<Page["locator"]>[0], options: Parameters<Page["locator"]>[1]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "locator">;
1228
+ locator(selector: Parameters<Page["locator"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "locator">;
1229
+ frameLocator(selector: Parameters<Page["frameLocator"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "frameLocator">;
1230
+ getByTestId(testId: Parameters<Page["getByTestId"]>[0]): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "testId">;
1231
+ getById(id: string | RegExp): ReusableLocatorBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, "id">;
1232
+ private create;
1233
+ }
1234
+
1235
+ declare class LocatorRegistryInternal<LocatorSchemaPathType extends string> {
1236
+ private readonly page;
1237
+ private readonly schemas;
1238
+ /**
1239
+ * Factory for reusable locator seeds that capture a locator strategy plus any chained
1240
+ * `filter`/`nth` steps without registering them. Pass the resulting seed to
1241
+ * {@link LocatorRegistryInternal.add} via `{ reuse }` to register a path that inherits the
1242
+ * stored definition and steps.
1243
+ *
1244
+ * @example
1245
+ * ```ts
1246
+ * const seed = registry.createReusable.getByRole("heading", { level: 2 }).filter({ hasText: /Summary/ });
1247
+ * registry.add("hero.title", { reuse: seed }).getByRole({ name: "Summary" });
1248
+ * ```
1249
+ */
1250
+ readonly createReusable: ReusableLocatorFactory<LocatorSchemaPathType>;
1251
+ constructor(page: Page);
1252
+ private normalizeRecord;
1253
+ private cloneRecordForReuse;
1254
+ /**
1255
+ * Registers a locator schema at the provided dot-delimited path.
1256
+ * Accepts exactly one locator strategy (`getByRole`, `locator`, etc.) and any number of
1257
+ * `filter`/`nth` steps chained in call order. When `{ reuse }` is supplied, the seeded
1258
+ * definition is applied first and one matching override is allowed as a PATCH of the seed;
1259
+ * otherwise, calling multiple locator strategies will throw.
1260
+ *
1261
+ * @example
1262
+ * ```ts
1263
+ * registry
1264
+ * .add("list.item")
1265
+ * .getByRole("listitem", { name: /Row/ })
1266
+ * .filter({ hasText: "Row" })
1267
+ * .nth("last");
1268
+ * ```
1269
+ */
1270
+ add(path: RegistryPath<LocatorSchemaPathType>): LocatorRegistrationPreDefinitionBuilder<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, false>;
1271
+ add(path: RegistryPath<LocatorSchemaPathType>, options: {
1272
+ reuse: RegistryPath<LocatorSchemaPathType>;
1273
+ }): void;
1274
+ add<Reuse extends ReusableLocator<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, LocatorStrategyDefinition["type"]>>(path: RegistryPath<LocatorSchemaPathType>, options: {
1275
+ reuse: Reuse;
1276
+ }): LocatorRegistrationSeededBuilderForType<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>, Reuse["type"]>;
1277
+ register(path: RegistryPath<LocatorSchemaPathType>, record: LocatorSchemaRecord<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>>): void;
1278
+ replace(path: RegistryPath<LocatorSchemaPathType>, record: LocatorSchemaRecord<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>>): void;
1279
+ get(path: RegistryPath<LocatorSchemaPathType>): LocatorSchemaRecord<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>>;
1280
+ unregister(path: RegistryPath<LocatorSchemaPathType>): void;
1281
+ getIfExists(path: RegistryPath<LocatorSchemaPathType>): LocatorSchemaRecord<LocatorSchemaPathType, RegistryPath<LocatorSchemaPathType>> | undefined;
1282
+ private resolveFilterLocator;
1283
+ private createResolutionContext;
1284
+ private getLocatorWithContext;
1285
+ private resolveFiltersForTarget;
1286
+ /**
1287
+ * Returns a mutable query builder clone for the provided path. Use the builder to add or clear
1288
+ * `filter`/`nth` steps, or to `update`/`replace` locator definitions before resolving locators.
1289
+ * Changes affect only the builder clone; the registry’s stored schema remains untouched.
1290
+ *
1291
+ * @example
1292
+ * ```ts
1293
+ * const builder = registry
1294
+ * .getLocatorSchema("section.button")
1295
+ * .filter("section.button", { hasText: /Save/ })
1296
+ * .nth("section", 0);
1297
+ * const locator = builder.getNestedLocator();
1298
+ * ```
1299
+ */
1300
+ getLocatorSchema<Path extends RegistryPath<LocatorSchemaPathType>>(path: Path): LocatorQueryBuilderPublic<LocatorSchemaPathType, Path>;
1301
+ /**
1302
+ * Resolves the Playwright {@link Locator} for the provided path, applying only the terminal
1303
+ * definition and its recorded steps (no ancestor chaining). Throws if the path is not registered.
1304
+ *
1305
+ * @example
1306
+ * ```ts
1307
+ * const button = registry.getLocator("form.submit");
1308
+ * await button.click();
1309
+ * ```
1310
+ */
1311
+ getLocator<Path extends RegistryPath<LocatorSchemaPathType>>(path: Path): Locator;
1312
+ /**
1313
+ * Resolves a chained Playwright {@link Locator} for a nested path, traversing each registered
1314
+ * segment and applying their steps in order. Throws if any segment in the chain is missing.
1315
+ *
1316
+ * @example
1317
+ * ```ts
1318
+ * const nested = registry.getNestedLocator("list.item");
1319
+ * await expect(nested).toBeVisible();
1320
+ * ```
1321
+ */
1322
+ getNestedLocator<Path extends RegistryPath<LocatorSchemaPathType>>(path: Path): Locator;
1323
+ buildLocatorChain(path: RegistryPath<LocatorSchemaPathType>, definitions: Map<string, LocatorStrategyDefinition>, steps: Map<string, LocatorStep<RegistryPath<LocatorSchemaPathType>, RegistryPath<LocatorSchemaPathType>>[]>, tombstones?: Set<string>, terminalDescription?: LocatorDescription, context?: {
1324
+ rootPath: RegistryPath<LocatorSchemaPathType>;
1325
+ resolvingPaths: Set<string>;
1326
+ }): {
1327
+ locator: Locator | null;
1328
+ steps: {
1329
+ path: string;
1330
+ definition: LocatorStrategyDefinition;
1331
+ appliedFilters: ResolvedFilterDefinition[];
1332
+ index?: IndexSelector | null | undefined;
1333
+ recordedSteps: LocatorStep<RegistryPath<LocatorSchemaPathType>, RegistryPath<LocatorSchemaPathType>>[];
1334
+ }[];
1335
+ };
1336
+ }
1337
+ type GetLocatorAccessor<LocatorSchemaPathType extends string> = <Path extends RegistryPath<LocatorSchemaPathType>>(path: Path) => Locator;
1338
+ type AddAccessor<LocatorSchemaPathType extends string> = LocatorRegistryInternal<LocatorSchemaPathType>["add"];
1339
+ type GetLocatorSchemaAccessor<LocatorSchemaPathType extends string> = <Path extends RegistryPath<LocatorSchemaPathType>>(path: Path) => LocatorQueryBuilderPublic<LocatorSchemaPathType, Path>;
1340
+ type GetNestedLocatorAccessor<LocatorSchemaPathType extends string> = <Path extends RegistryPath<LocatorSchemaPathType>>(path: Path) => Locator;
1341
+ type LocatorRegistry<LocatorSchemaPathType extends string> = Pick<LocatorRegistryInternal<LocatorSchemaPathType>, "add" | "createReusable" | "getLocator" | "getLocatorSchema" | "getNestedLocator">;
1342
+ /**
1343
+ * Creates a v2 locator registry bound to a Playwright {@link Page} and returns the registry plus
1344
+ * pre-bound helpers for ergonomic use in page objects and tests. Path unions are validated at
1345
+ * compile time and runtime. The returned `add`/`getLocator`/`getNestedLocator`/`getLocatorSchema`
1346
+ * accessors are pre-bound to the registry instance for dependency injection.
1347
+ *
1348
+ * @example
1349
+ * ```ts
1350
+ * const { registry, add, getNestedLocator, getLocatorSchema } =
1351
+ * createRegistryWithAccessors<"root" | "root.child">(page);
1352
+ *
1353
+ * registry.add("root").locator("section");
1354
+ * registry.add("root.child").getByRole("heading", { level: 2 });
1355
+ *
1356
+ * const nested = getNestedLocator("root.child");
1357
+ * const patched = getLocatorSchema("root.child").filter("root.child", { hasText: /Docs/ }).getNestedLocator();
1358
+ * ```
1359
+ */
1360
+ declare const createRegistryWithAccessors: <Paths extends string>(page: Page) => {
1361
+ readonly registry: LocatorRegistry<Paths>;
1362
+ readonly add: {
1363
+ (path: RegistryPath<Paths>): LocatorRegistrationPreDefinitionBuilder<Paths, RegistryPath<Paths>, false>;
1364
+ (path: RegistryPath<Paths>, options: {
1365
+ reuse: RegistryPath<Paths>;
1366
+ }): void;
1367
+ <Reuse extends ReusableLocator<Paths, RegistryPath<Paths>, "role" | "text" | "label" | "placeholder" | "altText" | "title" | "locator" | "frameLocator" | "testId" | "id">>(path: RegistryPath<Paths>, options: {
1368
+ reuse: Reuse;
1369
+ }): LocatorRegistrationSeededBuilderForType<Paths, RegistryPath<Paths>, Reuse["type"]>;
1370
+ };
1371
+ readonly getLocator: GetLocatorAccessor<Paths>;
1372
+ readonly getNestedLocator: GetNestedLocatorAccessor<Paths>;
1373
+ readonly getLocatorSchema: GetLocatorSchemaAccessor<Paths>;
1374
+ };
1375
+
1376
+ type UpdateArgsWithOptions<Primary, Options> = [] | [Primary] | [Options] | [Primary, Options];
1377
+ type UpdateArgsWithoutOptions<Primary> = [] | [Primary];
1378
+ declare class LocatorUpdateBuilder<LocatorSchemaPathType extends string, LocatorSubstring extends RegistryPath<LocatorSchemaPathType>, SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>> {
1379
+ private readonly parent;
1380
+ private readonly subPath;
1381
+ private readonly mode;
1382
+ constructor(parent: LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>, subPath: SubPath, mode?: "update" | "replace");
1383
+ /**
1384
+ * Defines or patches a `getByRole` locator strategy for the target subpath. In `update` mode the
1385
+ * `role` and `options` arguments are optional (PATCH semantics); in `replace` mode they follow
1386
+ * Playwright requirements (POST semantics) and `role` is required.
1387
+ *
1388
+ * @example
1389
+ * ```ts
1390
+ * getLocatorSchema("form.button")
1391
+ * .update("form.button")
1392
+ * .getByRole({ name: "Save" })
1393
+ * .getNestedLocator();
1394
+ * ```
1395
+ */
1396
+ getByRole(...args: UpdateArgsWithOptions<RoleDefinition["role"], RoleDefinition["options"]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1397
+ /**
1398
+ * Defines or patches a `getByText` locator strategy for the target subpath. In `update` mode,
1399
+ * text/options are optional; in `replace` mode text is required.
1400
+ *
1401
+ * @example
1402
+ * ```ts
1403
+ * getLocatorSchema("banner.message")
1404
+ * .replace("banner.message")
1405
+ * .getByText(/Updated/, { exact: false })
1406
+ * .getNestedLocator();
1407
+ * ```
1408
+ */
1409
+ getByText(...args: UpdateArgsWithOptions<Parameters<Page["getByText"]>[0], Parameters<Page["getByText"]>[1]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1410
+ /**
1411
+ * Defines or patches a `getByLabel` locator strategy for the target subpath. In `update` mode the
1412
+ * label text/options are optional; in `replace` mode text is required.
1413
+ *
1414
+ * @example
1415
+ * ```ts
1416
+ * getLocatorSchema("form.email").update("form.email").getByLabel({ exact: true }).getNestedLocator();
1417
+ * ```
1418
+ */
1419
+ getByLabel(...args: UpdateArgsWithOptions<Parameters<Page["getByLabel"]>[0], Parameters<Page["getByLabel"]>[1]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1420
+ /**
1421
+ * Defines or patches a `getByPlaceholder` locator strategy for the target subpath. In `update`
1422
+ * mode text/options are optional; in `replace` mode text is required.
1423
+ *
1424
+ * @example
1425
+ * ```ts
1426
+ * getLocatorSchema("form.search").update("form.search").getByPlaceholder({ exact: true }).getNestedLocator();
1427
+ * ```
1428
+ */
1429
+ getByPlaceholder(...args: UpdateArgsWithOptions<Parameters<Page["getByPlaceholder"]>[0], Parameters<Page["getByPlaceholder"]>[1]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1430
+ /**
1431
+ * Defines or patches a `getByAltText` locator strategy for the target subpath. In `update` mode
1432
+ * text/options are optional; in `replace` mode text is required.
1433
+ *
1434
+ * @example
1435
+ * ```ts
1436
+ * getLocatorSchema("image.logo").replace("image.logo").getByAltText("Logo").getNestedLocator();
1437
+ * ```
1438
+ */
1439
+ getByAltText(...args: UpdateArgsWithOptions<Parameters<Page["getByAltText"]>[0], Parameters<Page["getByAltText"]>[1]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1440
+ /**
1441
+ * Defines or patches a `getByTitle` locator strategy for the target subpath. In `update` mode
1442
+ * text/options are optional; in `replace` mode text is required.
1443
+ *
1444
+ * @example
1445
+ * ```ts
1446
+ * getLocatorSchema("icon.info").update("icon.info").getByTitle({ exact: true }).getNestedLocator();
1447
+ * ```
1448
+ */
1449
+ getByTitle(...args: UpdateArgsWithOptions<Parameters<Page["getByTitle"]>[0], Parameters<Page["getByTitle"]>[1]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1450
+ /**
1451
+ * Defines or patches a `locator` strategy for the target subpath. In `update` mode selector and
1452
+ * options are optional and merge with the existing definition; in `replace` mode selector is
1453
+ * required.
1454
+ *
1455
+ * @example
1456
+ * ```ts
1457
+ * getLocatorSchema("list.items")
1458
+ * .replace("list.items")
1459
+ * .locator("ul > li", { hasText: /Row/ })
1460
+ * .getNestedLocator();
1461
+ * ```
1462
+ */
1463
+ locator(...args: UpdateArgsWithOptions<Parameters<Page["locator"]>[0], Parameters<Page["locator"]>[1]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1464
+ /**
1465
+ * Defines or patches a `frameLocator` strategy for the target subpath. In `update` mode the
1466
+ * selector is optional and, when omitted, inherits the existing selector; in `replace` mode the
1467
+ * selector is required.
1468
+ *
1469
+ * @example
1470
+ * ```ts
1471
+ * getLocatorSchema("frame.login").replace("frame.login").frameLocator("iframe.auth").getNestedLocator();
1472
+ * ```
1473
+ */
1474
+ frameLocator(...args: UpdateArgsWithoutOptions<Parameters<Page["frameLocator"]>[0]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1475
+ /**
1476
+ * Defines or patches a `getByTestId` locator strategy for the target subpath. In `update` mode
1477
+ * `testId` is optional and merges with existing options; in `replace` mode it is required.
1478
+ *
1479
+ * @example
1480
+ * ```ts
1481
+ * getLocatorSchema("card.title").update("card.title").getByTestId().getNestedLocator();
1482
+ * ```
1483
+ */
1484
+ getByTestId(...args: UpdateArgsWithoutOptions<Parameters<Page["getByTestId"]>[0]>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1485
+ /**
1486
+ * Defines or patches an `id` locator strategy for the target subpath. In `update` mode the id is
1487
+ * optional and will be normalized if provided; in `replace` mode the id is required.
1488
+ *
1489
+ * @example
1490
+ * ```ts
1491
+ * getLocatorSchema("modal.close").update("modal.close").getById().getNestedLocator();
1492
+ * ```
1493
+ */
1494
+ getById(...args: UpdateArgsWithoutOptions<string | RegExp>): LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>;
1495
+ private commit;
1496
+ }
1497
+
1498
+ type LocatorQueryBuilderPublic<LocatorSchemaPathType extends string, LocatorSubstring extends RegistryPath<LocatorSchemaPathType>> = Pick<LocatorQueryBuilder<LocatorSchemaPathType, LocatorSubstring>, "filter" | "clearSteps" | "nth" | "describe" | "update" | "replace" | "remove" | "getLocator" | "getNestedLocator">;
1499
+ declare class LocatorQueryBuilder<LocatorSchemaPathType extends string, LocatorSubstring extends RegistryPath<LocatorSchemaPathType>> {
1500
+ private readonly registry;
1501
+ private readonly path;
1502
+ private readonly definitions;
1503
+ private readonly perPathTypeCache;
1504
+ private readonly steps;
1505
+ private readonly descriptions;
1506
+ private readonly tombstones;
1507
+ constructor(registry: LocatorRegistryInternal<LocatorSchemaPathType>, path: LocatorSubstring);
1508
+ /**
1509
+ * Starts a PATCH-style update for the locator definition at the given `subPath` within this
1510
+ * builder. Returns a builder exposing the same locator-type methods as `registry.add`, with all
1511
+ * arguments optional to merge with the existing definition. The registry remains unchanged until
1512
+ * you resolve with `getLocator`/`getNestedLocator`.
1513
+ *
1514
+ * If `subPath` is omitted, the terminal path for this builder (`path` passed to
1515
+ * `getLocatorSchema`) is used.
1516
+ *
1517
+ * @example
1518
+ * ```ts
1519
+ * getLocatorSchema("form.button")
1520
+ * .update("form.button")
1521
+ * .getByRole({ name: "Submit" })
1522
+ * .getNestedLocator();
1523
+ * ```
1524
+ */
1525
+ update(): LocatorUpdateBuilder<LocatorSchemaPathType, LocatorSubstring, LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>;
1526
+ update<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath): LocatorUpdateBuilder<LocatorSchemaPathType, LocatorSubstring, SubPath>;
1527
+ /**
1528
+ * Records a Playwright-style filter for the specified `subPath` within this builder. Unlike
1529
+ * `registry.add`, `subPath` is optional here: when omitted, the terminal path for this builder is
1530
+ * used. Provide an explicit `subPath` when targeting an ancestor segment.
1531
+ *
1532
+ * @example
1533
+ * ```ts
1534
+ * getLocatorSchema("list.item")
1535
+ * .filter("list", { hasText: "List" })
1536
+ * .filter("list.item", { hasText: "Row" });
1537
+ * ```
1538
+ */
1539
+ filter(filter: FilterDefinition<RegistryPath<LocatorSchemaPathType>, RegistryPath<LocatorSchemaPathType>>): this;
1540
+ filter<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath, filter: FilterDefinition<RegistryPath<LocatorSchemaPathType>, RegistryPath<LocatorSchemaPathType>>): this;
1541
+ /**
1542
+ * Clears all recorded `filter`/`nth` steps for the specified `subPath` in this builder, leaving
1543
+ * the locator definition intact. If `subPath` is omitted, the terminal path for this builder is
1544
+ * used; provide an explicit `subPath` to clear ancestor steps.
1545
+ *
1546
+ * @example
1547
+ * ```ts
1548
+ * getLocatorSchema("list.item").clearSteps("list.item").getNestedLocator();
1549
+ * ```
1550
+ */
1551
+ clearSteps(): this;
1552
+ clearSteps<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath): this;
1553
+ /**
1554
+ * Records an index selector for the specified `subPath` in this builder. Indices are applied in
1555
+ * the order they are chained and require that the subPath already exists on the builder. If
1556
+ * `subPath` is omitted, the terminal path for this builder is used; provide an explicit `subPath`
1557
+ * to target ancestor segments.
1558
+ *
1559
+ * @example
1560
+ * ```ts
1561
+ * getLocatorSchema("list.item").nth("list.item", 2).getNestedLocator();
1562
+ * ```
1563
+ */
1564
+ nth(index: IndexSelector): this;
1565
+ nth<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath, index: IndexSelector): this;
1566
+ /**
1567
+ * Adds or overrides the description for the terminal path of this builder. The description is
1568
+ * applied only to the resolved terminal locator and does not mutate registry state.
1569
+ *
1570
+ * @example
1571
+ * ```ts
1572
+ * getLocatorSchema("section.button")
1573
+ * .describe("Save button")
1574
+ * .getNestedLocator();
1575
+ * ```
1576
+ */
1577
+ describe(description: LocatorDescription): this;
1578
+ /** @internal */
1579
+ applyUpdate<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath, updates: LocatorUpdate): this;
1580
+ /**
1581
+ * Starts a POST-style replacement for the locator definition at the given `subPath` within this
1582
+ * builder. Returns a builder exposing the same locator-type methods as `registry.add`, requiring
1583
+ * primary arguments where Playwright does. Registry state is unchanged; the replacement applies
1584
+ * to the builder clone when resolved. If `subPath` is omitted, the terminal path for this
1585
+ * builder is used.
1586
+ *
1587
+ * @example
1588
+ * ```ts
1589
+ * getLocatorSchema("section.button")
1590
+ * .replace("section.button")
1591
+ * .getByRole("button", { name: "Save" })
1592
+ * .getNestedLocator();
1593
+ * ```
1594
+ */
1595
+ replace(): LocatorUpdateBuilder<LocatorSchemaPathType, LocatorSubstring, LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>;
1596
+ replace<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath): LocatorUpdateBuilder<LocatorSchemaPathType, LocatorSubstring, SubPath>;
1597
+ /** @internal */
1598
+ applyReplacement<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath, updates: LocatorUpdate): this;
1599
+ /**
1600
+ * Soft-deletes the definition and steps for the given `subPath` on this builder clone, adding a
1601
+ * tombstone. Non-terminal removals are skipped during resolution; terminal removals throw unless
1602
+ * repopulated with `update`/`replace` before resolving. If `subPath` is omitted, the terminal
1603
+ * path for this builder is used.
1604
+ *
1605
+ * @example
1606
+ * ```ts
1607
+ * const builder = getLocatorSchema("section.button");
1608
+ * builder.remove("section.button");
1609
+ * expect(() => builder.getNestedLocator()).toThrow();
1610
+ * ```
1611
+ */
1612
+ remove(): this;
1613
+ remove<SubPath extends LocatorChainPaths<RegistryPath<LocatorSchemaPathType>, LocatorSubstring>>(subPath: SubPath): this;
1614
+ /**
1615
+ * Resolves and returns the Playwright {@link Locator} for the terminal path of this builder,
1616
+ * applying only the terminal definition and its steps. Throws if the terminal path has been
1617
+ * removed or is otherwise missing.
1618
+ *
1619
+ * @example
1620
+ * ```ts
1621
+ * const locator = getLocatorSchema("form.submit").getLocator();
1622
+ * ```
1623
+ */
1624
+ getLocator(): Locator;
1625
+ /**
1626
+ * Resolves the chained Playwright {@link Locator} for this builder’s root path, traversing each
1627
+ * registered segment and applying recorded steps. Throws if any required segment is missing.
1628
+ *
1629
+ * @example
1630
+ * ```ts
1631
+ * const nested = getLocatorSchema("list.item")
1632
+ * .filter("list", { hasText: "List" })
1633
+ * .getNestedLocator();
1634
+ * ```
1635
+ */
1636
+ getNestedLocator(): Locator;
1637
+ private ensureSubPath;
1638
+ private resolve;
1639
+ private ensureTypeCache;
1640
+ }
1641
+
1642
+ /**
1643
+ * BasePageOptions can define optional patterns for baseUrl and urlPath.
1644
+ * Defaults assume they are strings if not specified.
1645
+ */
1646
+ type BasePageOptions = {
1647
+ urlOptions?: {
1648
+ baseUrlType?: string | RegExp;
1649
+ urlPathType?: string | RegExp;
1650
+ };
1651
+ };
1652
+ type ExtractBaseUrlType<T extends BasePageOptions> = T["urlOptions"] extends {
1653
+ baseUrlType: RegExp;
1654
+ } ? RegExp : string;
1655
+ type ExtractUrlPathType<T extends BasePageOptions> = T["urlOptions"] extends {
1656
+ urlPathType: RegExp;
1657
+ } ? RegExp : string;
1658
+ type ExtractFullUrlType<T extends BasePageOptions> = T["urlOptions"] extends {
1659
+ baseUrlType: RegExp;
1660
+ } | {
1661
+ urlPathType: RegExp;
1662
+ } ? RegExp : string;
1663
+ /**
1664
+ * @deprecated Transitional bridge for migrating from v1 to v2. This class will be removed in v2.
1665
+ * Switch to PageObject and the v2 registry DSL, see docs/v1-to-v2-migration
1666
+ *
1667
+ * BasePageV1toV2:
1668
+ * Migration-friendly BasePage that maintains v1 schema ingestion while exposing v2 registries.
1669
+ *
1670
+ * Generics:
1671
+ * - LocatorSchemaPathType: A union of valid locator paths.
1672
+ * - Options: Configuration type for URLs.
1673
+ * - LocatorSubstring: The chosen substring locator.
1674
+ */
1675
+ declare abstract class BasePageV1toV2<LocatorSchemaPathType extends string, Options extends BasePageOptions = {
1676
+ urlOptions: {
1677
+ baseUrlType: string;
1678
+ urlPathType: string;
1679
+ };
1680
+ }, LocatorSubstring extends LocatorSchemaPathType | undefined = undefined> {
1681
+ /** Provides Playwright page methods */
1682
+ page: Page;
1683
+ /** Playwright TestInfo contains information about currently running test, available to any test function */
1684
+ testInfo: TestInfo;
1685
+ /** Selectors can be used to install custom selector engines.*/
1686
+ selector: Selectors;
1687
+ /** The base URL of the Page Object Class */
1688
+ baseUrl: ExtractBaseUrlType<Options>;
1689
+ /** The URL path of the Page Object Class */
1690
+ urlPath: ExtractUrlPathType<Options>;
1691
+ /** The full URL of the Page Object Class */
1692
+ fullUrl: ExtractFullUrlType<Options>;
1693
+ /** The name of the Page Object Class */
1694
+ pocName: string;
1695
+ /** The Page Object Class' PlaywrightReportLogger instance, prefixed with its name. Log levels: debug, info, warn, and error. */
873
1696
  protected log: PlaywrightReportLogger;
874
- protected request: APIRequestContext;
875
- constructor(baseUrl: string, apiName: string, context: APIRequestContext, pwrl: PlaywrightReportLogger);
1697
+ /** The SessionStorage class provides methods for setting and getting session storage data in Playwright.*/
1698
+ sessionStorage: SessionStorage$1;
1699
+ /**
1700
+ * locators:
1701
+ * An instance of GetLocatorBase that handles schema management and provides getLocatorSchema calls.
1702
+ * Initially, LocatorSubstring is undefined. Once getLocatorSchema(path) is called,
1703
+ * we get a chainable object typed with LocatorSubstring = P.
1704
+ */
1705
+ protected locators: GetLocatorBase<LocatorSchemaPathType, LocatorSubstring>;
1706
+ /**
1707
+ * v2 locator registry and accessors, used for migration to the fluent registry DSL.
1708
+ */
1709
+ protected readonly locatorRegistry: LocatorRegistry<LocatorSchemaPathType>;
1710
+ readonly add: AddAccessor<LocatorSchemaPathType>;
1711
+ readonly getLocator: GetLocatorAccessor<LocatorSchemaPathType>;
1712
+ readonly getLocatorSchema: GetLocatorSchemaAccessor<LocatorSchemaPathType>;
1713
+ readonly getNestedLocator: GetNestedLocatorAccessor<LocatorSchemaPathType>;
1714
+ constructor(page: Page, testInfo: TestInfo, baseUrl: ExtractBaseUrlType<Options>, urlPath: ExtractUrlPathType<Options>, pocName: string, pwrl: PlaywrightReportLogger, locatorSubstring?: LocatorSubstring);
1715
+ /**
1716
+ * constructFullUrl:
1717
+ * Combines baseUrl and urlPath, handling both strings and RegExps.
1718
+ * Ensures a flexible approach to URL matching (string or regex-based).
1719
+ */
1720
+ private constructFullUrl;
1721
+ /**
1722
+ * defineLocators:
1723
+ * Abstract method to be implemented by each POC for v2 registry definitions.
1724
+ */
1725
+ protected abstract defineLocators(): void;
1726
+ /**
1727
+ * @deprecated V1 schema ingestion will be removed in 2.0.0. Migrate definitions to defineLocators.
1728
+ * initLocatorSchemas:
1729
+ * Abstract method to be implemented by each POC for v1 locator schema definitions.
1730
+ */
1731
+ protected abstract initLocatorSchemas(): void;
1732
+ }
1733
+
1734
+ type WaitUntil = NonNullable<Parameters<Page["goto"]>[1]>["waitUntil"];
1735
+ type State = NonNullable<Parameters<Page["waitForLoadState"]>[0]>;
1736
+ type NavigationOptions = {
1737
+ waitUntil?: WaitUntil;
1738
+ waitForLoadState?: State;
1739
+ };
1740
+ interface NavigationString {
1741
+ goto(urlPathOrUrl: string, options?: NavigationOptions): Promise<void>;
1742
+ gotoThisPage(options?: NavigationOptions): Promise<void>;
1743
+ expectThisPage(options?: NavigationOptions): Promise<void>;
1744
+ expectAnotherPage(options?: NavigationOptions): Promise<void>;
1745
+ }
1746
+ interface NavigationRegExp {
1747
+ expectThisPage(options?: NavigationOptions): Promise<void>;
1748
+ expectAnotherPage(options?: NavigationOptions): Promise<void>;
876
1749
  }
1750
+ type ExtractNavigationType<FullUrlType> = FullUrlType extends RegExp ? NavigationRegExp : NavigationString;
1751
+
1752
+ /**
1753
+ * Defines the SessionStorage class to manage session storage in Playwright.
1754
+ * It provides methods to set, get, and clear session storage data, and to handle data before page navigation.
1755
+ */
1756
+ type SessionStorageState<T = unknown> = Record<string, T>;
1757
+ type SetOptions = {
1758
+ reload?: boolean;
1759
+ waitForContext?: boolean;
1760
+ };
1761
+ type WaitForContextOptions = {
1762
+ waitForContext?: boolean;
1763
+ };
1764
+ type SessionStorageOptions = {
1765
+ label?: string;
1766
+ };
1767
+ declare class SessionStorage {
1768
+ private page;
1769
+ private options;
1770
+ private queuedStates;
1771
+ private isInitiated;
1772
+ constructor(page: Page, options?: SessionStorageOptions);
1773
+ private getStepLabel;
1774
+ private hasContext;
1775
+ private waitForContextAvailability;
1776
+ private ensureContext;
1777
+ /** Writes states to session storage. Accepts an object with key-value pairs representing the states. */
1778
+ private writeToSessionStorage;
1779
+ /** Reads all states from session storage and returns them as an object. */
1780
+ private readFromSessionStorage;
1781
+ /**
1782
+ * Sets the specified states in session storage.
1783
+ * Optionally waits for the next main-frame navigation to establish a valid context before writing,
1784
+ * and reloads the page after setting the data.
1785
+ *
1786
+ * Parameters:
1787
+ * states: Object representing the states to set in session storage.
1788
+ * reload: Boolean indicating whether to reload the page after setting the session storage data.
1789
+ * waitForContext: Boolean indicating whether to wait for a main-frame navigation and a valid context.
1790
+ */
1791
+ set<T = unknown>(states: SessionStorageState<T>, options?: SetOptions): Promise<void>;
1792
+ /**
1793
+ * Queues states to be set in the sessionStorage before the next navigation occurs.
1794
+ * Handles different scenarios based on multiple calls made before the navigation occurs.
1795
+ *
1796
+ * 1. No Context, Single Call: Queues and sets states upon the next navigation.
1797
+ * 2. No Context, Multiple Calls: Merges states from multiple calls and sets them upon the next navigation.
1798
+ * 3. With Context: Still queues until the next navigation.
1799
+ *
1800
+ * Parameters:
1801
+ * states: Object representing the states to queue for setting in session storage.
1802
+ */
1803
+ setOnNextNavigation<T = unknown>(states: SessionStorageState<T>): Promise<void>;
1804
+ /**
1805
+ * Fetches states from session storage.
1806
+ * If specific keys are provided, fetches only those states; otherwise, fetches all states.
1807
+ *
1808
+ * Parameters:
1809
+ * keys: Optional array of keys to specify which states to fetch from session storage.
1810
+ * waitForContext: Boolean indicating whether to wait for a main-frame navigation and a valid context.
1811
+ *
1812
+ * Returns:
1813
+ * Object containing the fetched states.
1814
+ */
1815
+ get<T = unknown>(keys?: string[]): Promise<SessionStorageState<T>>;
1816
+ get<T = unknown>(keys: string[] | undefined, options: WaitForContextOptions): Promise<SessionStorageState<T>>;
1817
+ /**
1818
+ * Clears states in sessionStorage. When keys are provided, clears only those entries.
1819
+ * Pass `waitForContext` to wait for the next main-frame navigation and validate that a usable context exists.
1820
+ */
1821
+ clear(): Promise<void>;
1822
+ clear(options: WaitForContextOptions): Promise<void>;
1823
+ clear(key: string | string[]): Promise<void>;
1824
+ clear(key: string | string[], options: WaitForContextOptions): Promise<void>;
1825
+ }
1826
+
1827
+ /**
1828
+ * UrlTypeOptions define types for baseUrl and urlPath.
1829
+ * string is the default type; The types can be overridden to RegExp, using the Extract...Type utility types. If either
1830
+ * baseUrlType or urlPathType is set to RegExp, then fullUrlType will also be RegExp and can't be used for navigation,
1831
+ * only validation through URL matching.
1832
+ */
1833
+ type UrlTypeOptions = {
1834
+ baseUrlType?: string | RegExp;
1835
+ urlPathType?: string | RegExp;
1836
+ };
1837
+ type BaseUrlTypeFromOptions<T extends UrlTypeOptions> = T extends {
1838
+ baseUrlType: RegExp;
1839
+ } ? RegExp : string;
1840
+ type UrlPathTypeFromOptions<T extends UrlTypeOptions> = T extends {
1841
+ urlPathType: RegExp;
1842
+ } ? RegExp : "" | string;
1843
+ type FullUrlTypeFromOptions<T extends UrlTypeOptions> = T extends {
1844
+ baseUrlType: RegExp;
1845
+ } | {
1846
+ urlPathType: RegExp;
1847
+ } ? RegExp : string;
1848
+ declare abstract class PageObject<LocatorSchemaPathType extends string, Options extends UrlTypeOptions = {
1849
+ baseUrlType: string;
1850
+ urlPathType: string;
1851
+ }> {
1852
+ readonly page: Page;
1853
+ readonly baseUrl: BaseUrlTypeFromOptions<Options>;
1854
+ readonly urlPath: UrlPathTypeFromOptions<Options>;
1855
+ readonly fullUrl: FullUrlTypeFromOptions<Options>;
1856
+ readonly label: string;
1857
+ readonly sessionStorage: SessionStorage;
1858
+ readonly navigation: ExtractNavigationType<FullUrlTypeFromOptions<Options>>;
1859
+ protected readonly locatorRegistry: LocatorRegistry<LocatorSchemaPathType>;
1860
+ readonly add: AddAccessor<LocatorSchemaPathType>;
1861
+ readonly getLocator: GetLocatorAccessor<LocatorSchemaPathType>;
1862
+ readonly getLocatorSchema: GetLocatorSchemaAccessor<LocatorSchemaPathType>;
1863
+ readonly getNestedLocator: GetNestedLocatorAccessor<LocatorSchemaPathType>;
1864
+ protected constructor(page: Page, baseUrl: BaseUrlTypeFromOptions<Options>, urlPath: UrlPathTypeFromOptions<Options>, options?: {
1865
+ label?: string;
1866
+ navOptions?: NavigationOptions;
1867
+ });
1868
+ protected abstract defineLocators(): void;
1869
+ protected abstract pageActionsToPerformAfterNavigation(): (() => Promise<void>)[] | null;
1870
+ private composeFullUrl;
1871
+ }
1872
+
1873
+ type BaseFixtures = {
1874
+ log: PlaywrightReportLogger;
1875
+ };
1876
+ declare const test: _playwright_test.TestType<_playwright_test.PlaywrightTestArgs & _playwright_test.PlaywrightTestOptions & BaseFixtures, _playwright_test.PlaywrightWorkerArgs & _playwright_test.PlaywrightWorkerOptions>;
1877
+
1878
+ type AnyMethod<This = unknown, Args extends unknown[] = unknown[], Return = unknown> = (this: This, ...args: Args) => Return;
1879
+ type StepTitle = Parameters<typeof test$1.step>[0];
1880
+ type StepOptions = Parameters<typeof test$1.step>[2];
1881
+ interface StepDecoratorFactory {
1882
+ <This, Args extends unknown[], Return>(value: AnyMethod<This, Args, Return>, context: ClassMethodDecoratorContext<This, AnyMethod<This, Args, Return>>): AnyMethod<This, Args, Return> | undefined;
1883
+ <This, Args extends unknown[], Return>(target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<AnyMethod<This, Args, Return>>): TypedPropertyDescriptor<AnyMethod<This, Args, Return>> | undefined;
1884
+ }
1885
+ /**
1886
+ * Wraps a method in Playwright `test.step`, defaulting the title to `ClassName.methodName`.
1887
+ *
1888
+ * Examples:
1889
+ * - `@step`
1890
+ * - `@step("title")`
1891
+ * - `@step({ box: true })`
1892
+ * - `@step("title", { timeout: 5000 })`
1893
+ */
1894
+ declare function step(): StepDecoratorFactory;
1895
+ declare function step(title: StepTitle): StepDecoratorFactory;
1896
+ declare function step(options: StepOptions): StepDecoratorFactory;
1897
+ declare function step(title: StepTitle, options: StepOptions): StepDecoratorFactory;
1898
+ declare function step<This, Args extends unknown[], Return>(value: AnyMethod<This, Args, Return>, context: ClassMethodDecoratorContext<This, AnyMethod<This, Args, Return>>): AnyMethod<This, Args, Return> | undefined;
877
1899
 
878
- export { type AriaRoleType, BaseApi, BasePage, type BasePageOptions, type ExtractBaseUrlType, type ExtractFullUrlType, type ExtractUrlPathType, GetByMethod, GetLocatorBase, type LocatorSchema, type LocatorSchemaWithoutPath, PlaywrightReportLogger, test };
1900
+ export { type AddAccessor, type AriaRoleType, BaseApi, BasePage, type BasePageOptions$1 as BasePageOptions, BasePageV1toV2, type BaseUrlTypeFromOptions, type ExtractBaseUrlType$1 as ExtractBaseUrlType, type ExtractFullUrlType$1 as ExtractFullUrlType, type ExtractUrlPathType$1 as ExtractUrlPathType, type FullUrlTypeFromOptions, GetByMethod, type GetLocatorAccessor, GetLocatorBase, type GetLocatorSchemaAccessor, type GetNestedLocatorAccessor, type LocatorRegistry, type LocatorSchema, type LocatorSchemaWithoutPath, type LogEntry, type LogLevel, type NavigationOptions, PageObject, PlaywrightReportLogger, SessionStorage, type UrlPathTypeFromOptions, type UrlTypeOptions, createRegistryWithAccessors, step, test };