testeiya 0.10.0 → 0.10.2

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 (241) hide show
  1. package/PIPELINES.md +3 -0
  2. package/README.md +10 -20
  3. package/dist/prompt/clis.d.ts +7 -0
  4. package/dist/prompt/pipeline-report.d.ts +1 -0
  5. package/dist/prompt/report.d.ts +10 -0
  6. package/dist/prompt/system-prompt.d.ts +22 -0
  7. package/dist/prompt/system-prompt.js +1 -1
  8. package/dist/prompt/system-prompt.js.map +1 -1
  9. package/dist/prompt/testomat.io.d.ts +19 -0
  10. package/dist/prompt/thread.d.ts +73 -0
  11. package/dist/src/args.d.ts +39 -0
  12. package/dist/src/attribution-extension.d.ts +3 -0
  13. package/dist/src/checkpoint.d.ts +30 -0
  14. package/dist/src/cli.d.ts +2 -0
  15. package/dist/src/cli.js +27 -32
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/doctor.d.ts +11 -0
  18. package/dist/src/env.d.ts +30 -0
  19. package/dist/src/exec.d.ts +11 -0
  20. package/dist/src/git.d.ts +41 -0
  21. package/dist/src/git.js +10 -0
  22. package/dist/src/git.js.map +1 -1
  23. package/dist/src/langfuse-extension.d.ts +7 -0
  24. package/dist/src/langfuse.d.ts +67 -0
  25. package/dist/src/mcp.d.ts +19 -0
  26. package/dist/src/model.d.ts +20 -0
  27. package/dist/src/model.js +2 -0
  28. package/dist/src/model.js.map +1 -1
  29. package/dist/src/models.d.ts +1 -0
  30. package/dist/src/output.d.ts +84 -0
  31. package/dist/src/pipeline/command-stage.d.ts +12 -0
  32. package/dist/src/pipeline/crash-guard.d.ts +12 -0
  33. package/dist/src/pipeline/crash-guard.js +21 -0
  34. package/dist/src/pipeline/crash-guard.js.map +1 -0
  35. package/dist/src/pipeline/diagram.d.ts +24 -0
  36. package/dist/src/pipeline/gate.d.ts +21 -0
  37. package/dist/src/pipeline/launcher.d.ts +33 -0
  38. package/dist/src/pipeline/launcher.js +16 -3
  39. package/dist/src/pipeline/launcher.js.map +1 -1
  40. package/dist/src/pipeline/log.d.ts +29 -0
  41. package/dist/src/pipeline/log.js +9 -0
  42. package/dist/src/pipeline/log.js.map +1 -1
  43. package/dist/src/pipeline/overlay.d.ts +29 -0
  44. package/dist/src/pipeline/pipeline-file.d.ts +44 -0
  45. package/dist/src/pipeline/pipeline-file.js +16 -8
  46. package/dist/src/pipeline/pipeline-file.js.map +1 -1
  47. package/dist/src/pipeline/pipeline.d.ts +78 -0
  48. package/dist/src/pipeline/pipeline.js +33 -7
  49. package/dist/src/pipeline/pipeline.js.map +1 -1
  50. package/dist/src/pipeline/report.d.ts +26 -0
  51. package/dist/src/pipeline/report.js +13 -0
  52. package/dist/src/pipeline/report.js.map +1 -1
  53. package/dist/src/pipeline/spec.d.ts +63 -0
  54. package/dist/src/pipeline/stage-env.d.ts +13 -0
  55. package/dist/src/pipeline/stage-env.js +31 -0
  56. package/dist/src/pipeline/stage-env.js.map +1 -0
  57. package/dist/src/pipeline/stage.d.ts +71 -0
  58. package/dist/src/pipeline/stage.js.map +1 -1
  59. package/dist/src/pipeline/state.d.ts +63 -0
  60. package/dist/src/pipeline/summary-stage.d.ts +24 -0
  61. package/dist/src/pipeline/task-stage.d.ts +24 -0
  62. package/dist/src/pipeline/task-stage.js +86 -2
  63. package/dist/src/pipeline/task-stage.js.map +1 -1
  64. package/dist/src/pipeline/variables.d.ts +20 -0
  65. package/dist/src/result.d.ts +6 -0
  66. package/dist/src/run.d.ts +69 -0
  67. package/dist/src/run.js +116 -60
  68. package/dist/src/run.js.map +1 -1
  69. package/dist/src/session.d.ts +43 -0
  70. package/dist/src/session.js +3 -1
  71. package/dist/src/session.js.map +1 -1
  72. package/dist/src/sessions.d.ts +23 -0
  73. package/dist/src/skills.d.ts +29 -0
  74. package/package.json +11 -2
  75. package/pipelines/api-testing.yml +16 -5
  76. package/pipelines/issue-test-cases.yml +3 -4
  77. package/pipelines/pr-review.yml +14 -5
  78. package/pipelines/regression.yml +1 -0
  79. package/pipelines/web-testing.yml +1 -0
  80. package/prompt/system-prompt.ts +1 -1
  81. package/scripts/vendor-skills.js +62 -0
  82. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -119
  83. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -141
  84. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -100
  85. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -196
  86. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -83
  87. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -126
  88. package/skills/codeceptjs/lint-codeceptjs-tests/SKILL.md +0 -104
  89. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -109
  90. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -295
  91. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -339
  92. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -459
  93. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -338
  94. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -78
  95. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -102
  96. package/skills/playwright/playwright-best-practices/SKILL.md +0 -303
  97. package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +0 -360
  98. package/skills/playwright/playwright-best-practices/advanced/authentication.md +0 -871
  99. package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +0 -364
  100. package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +0 -409
  101. package/skills/playwright/playwright-best-practices/advanced/multi-context.md +0 -288
  102. package/skills/playwright/playwright-best-practices/advanced/multi-user.md +0 -393
  103. package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +0 -452
  104. package/skills/playwright/playwright-best-practices/advanced/third-party.md +0 -464
  105. package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  106. package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +0 -369
  107. package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +0 -383
  108. package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  109. package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +0 -403
  110. package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +0 -504
  111. package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +0 -403
  112. package/skills/playwright/playwright-best-practices/core/annotations.md +0 -424
  113. package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +0 -361
  114. package/skills/playwright/playwright-best-practices/core/configuration.md +0 -452
  115. package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +0 -417
  116. package/skills/playwright/playwright-best-practices/core/global-setup.md +0 -434
  117. package/skills/playwright/playwright-best-practices/core/locators.md +0 -242
  118. package/skills/playwright/playwright-best-practices/core/page-object-model.md +0 -315
  119. package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +0 -453
  120. package/skills/playwright/playwright-best-practices/core/test-data.md +0 -492
  121. package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +0 -361
  122. package/skills/playwright/playwright-best-practices/core/test-tags.md +0 -298
  123. package/skills/playwright/playwright-best-practices/debugging/console-errors.md +0 -420
  124. package/skills/playwright/playwright-best-practices/debugging/debugging.md +0 -504
  125. package/skills/playwright/playwright-best-practices/debugging/error-testing.md +0 -360
  126. package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +0 -496
  127. package/skills/playwright/playwright-best-practices/frameworks/angular.md +0 -530
  128. package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +0 -469
  129. package/skills/playwright/playwright-best-practices/frameworks/react.md +0 -531
  130. package/skills/playwright/playwright-best-practices/frameworks/vue.md +0 -574
  131. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  132. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  133. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  134. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  135. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  136. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  137. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  138. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  139. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  140. package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  141. package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  142. package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  143. package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  144. package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  145. package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  146. package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +0 -509
  147. package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  148. package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  149. package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  150. package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  151. package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +0 -508
  152. package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  153. package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  154. package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  155. package/skills/playwright/playwright-cli/SKILL.md +0 -489
  156. package/skills/playwright/playwright-cli/references/element-attributes.md +0 -23
  157. package/skills/playwright/playwright-cli/references/playwright-tests.md +0 -39
  158. package/skills/playwright/playwright-cli/references/pr-attachments.md +0 -60
  159. package/skills/playwright/playwright-cli/references/request-mocking.md +0 -87
  160. package/skills/playwright/playwright-cli/references/running-code.md +0 -245
  161. package/skills/playwright/playwright-cli/references/session-management.md +0 -227
  162. package/skills/playwright/playwright-cli/references/storage-state.md +0 -275
  163. package/skills/playwright/playwright-cli/references/test-generation.md +0 -433
  164. package/skills/playwright/playwright-cli/references/tracing.md +0 -139
  165. package/skills/playwright/playwright-cli/references/video-recording.md +0 -216
  166. package/skills/skills.lock.json +0 -89
  167. package/skills/skills.yaml +0 -35
  168. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/SKILL.md +0 -0
  169. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/references/no-install.md +0 -0
  170. /package/skills/{testomatio/explorbot → explorbot}/explorbot-plan/SKILL.md +0 -0
  171. /package/skills/{testomatio/explorbot → explorbot}/explorbot-setup/SKILL.md +0 -0
  172. /package/skills/{testomatio/explorbot → explorbot}/prima/SKILL.md +0 -0
  173. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/SKILL.md +0 -0
  174. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/references/output-format.md +0 -0
  175. /package/skills/{testomatio/qa-process → qa-process}/qa-review-pr/SKILL.md +0 -0
  176. /package/skills/{testomatio/qa-process → qa-process}/testing-workflow/SKILL.md +0 -0
  177. /package/skills/{testomatio/requirements → requirements}/catalog-features/SKILL.md +0 -0
  178. /package/skills/{testomatio/requirements → requirements}/catalog-features/references/layout.md +0 -0
  179. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/SKILL.md +0 -0
  180. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/features.md +0 -0
  181. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/layout.md +0 -0
  182. /package/skills/{testomatio/requirements → requirements}/pull-request-diff-analyzer/SKILL.md +0 -0
  183. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/SKILL.md +0 -0
  184. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/answer-shapes.md +0 -0
  185. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/examples.md +0 -0
  186. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/SKILL.md +0 -0
  187. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/references/summary-example.md +0 -0
  188. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/SKILL.md +0 -0
  189. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -0
  190. /package/skills/{testomatio/requirements → requirements}/qa-thinking/SKILL.md +0 -0
  191. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/SKILL.md +0 -0
  192. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/behaviors.md +0 -0
  193. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/layout.md +0 -0
  194. /package/skills/{testomatio/requirements → requirements}/write-user-story/SKILL.md +0 -0
  195. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/CLAUDE.md +0 -0
  196. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/SKILL.md +0 -0
  197. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -0
  198. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -0
  199. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -0
  200. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -0
  201. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -0
  202. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/SKILL.md +0 -0
  203. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -0
  204. /package/skills/{testomatio/test-automation → test-automation}/epic-requirements-specification/SKILL.md +0 -0
  205. /package/skills/{testomatio/test-automation → test-automation}/qa-automation-test-consolidation/SKILL.md +0 -0
  206. /package/skills/{testomatio/test-automation → test-automation}/qa-data-seeder/SKILL.md +0 -0
  207. /package/skills/{testomatio/test-automation → test-automation}/run-tests-with-testomatio-reporter/SKILL.md +0 -0
  208. /package/skills/{testomatio/test-automation → test-automation}/setup-change-aware-pr-testing/SKILL.md +0 -0
  209. /package/skills/{testomatio/test-automation → test-automation}/setup-ci-automation/SKILL.md +0 -0
  210. /package/skills/{testomatio/test-automation → test-automation}/testomat-allure-adapter/SKILL.md +0 -0
  211. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/SKILL.md +0 -0
  212. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -0
  213. /package/skills/{testomatio/test-management → test-management}/detect-useless-tests/SKILL.md +0 -0
  214. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/SKILL.md +0 -0
  215. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -0
  216. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/SKILL.md +0 -0
  217. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CSV_MIGRATION.md +0 -0
  218. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +0 -0
  219. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTMO_MIGRATION.md +0 -0
  220. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +0 -0
  221. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/XRAY_MIGRATION.md +0 -0
  222. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/SKILL.md +0 -0
  223. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -0
  224. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -0
  225. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -0
  226. /package/skills/{testomatio/test-management → test-management}/qa-split-testing-levels-pyramid/SKILL.md +0 -0
  227. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/SKILL.md +0 -0
  228. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +0 -0
  229. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/SKILL.md +0 -0
  230. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -0
  231. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -0
  232. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/scripts/check-coverage.mjs +0 -0
  233. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/SKILL.md +0 -0
  234. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/test-case-format.md +0 -0
  235. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/testomat-tms-guide.md +0 -0
  236. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/writing-rule.md +0 -0
  237. /package/skills/{testomatio/test-management → test-management}/scan-automation-project/SKILL.md +0 -0
  238. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/SKILL.md +0 -0
  239. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -0
  240. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/SKILL.md +0 -0
  241. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/references/MCP_SETUP.md +0 -0
@@ -1,315 +0,0 @@
1
- # Page Object Model (POM)
2
-
3
- ## Table of Contents
4
-
5
- 1. [Overview](#overview)
6
- 2. [Basic Structure](#basic-structure)
7
- 3. [Component Objects](#component-objects)
8
- 4. [Composition Patterns](#composition-patterns)
9
- 5. [Factory Functions](#factory-functions)
10
- 6. [Best Practices](#best-practices)
11
-
12
- ## Overview
13
-
14
- Page Object Model encapsulates page structure and interactions, providing:
15
-
16
- - **Maintainability**: Change selectors in one place
17
- - **Reusability**: Share page interactions across tests
18
- - **Readability**: Tests express intent, not implementation
19
-
20
- ## Basic Structure
21
-
22
- ### Page Class
23
-
24
- ```typescript
25
- // pages/login.page.ts
26
- import { Page, Locator, expect } from "@playwright/test";
27
-
28
- export class LoginPage {
29
- readonly page: Page;
30
- readonly emailInput: Locator;
31
- readonly passwordInput: Locator;
32
- readonly submitButton: Locator;
33
- readonly errorMessage: Locator;
34
-
35
- constructor(page: Page) {
36
- this.page = page;
37
- this.emailInput = page.getByLabel("Email");
38
- this.passwordInput = page.getByLabel("Password");
39
- this.submitButton = page.getByRole("button", { name: "Sign in" });
40
- this.errorMessage = page.getByRole("alert");
41
- }
42
-
43
- async goto() {
44
- await this.page.goto("/login");
45
- }
46
-
47
- async login(email: string, password: string) {
48
- await this.emailInput.fill(email);
49
- await this.passwordInput.fill(password);
50
- await this.submitButton.click();
51
- }
52
-
53
- async expectError(message: string) {
54
- await expect(this.errorMessage).toContainText(message);
55
- }
56
- }
57
- ```
58
-
59
- ### Usage in Tests
60
-
61
- ```typescript
62
- // tests/login.spec.ts
63
- import { test, expect } from "@playwright/test";
64
- import { LoginPage } from "../pages/login.page";
65
-
66
- test.describe("Login", () => {
67
- test("successful login redirects to dashboard", async ({ page }) => {
68
- const loginPage = new LoginPage(page);
69
- await loginPage.goto();
70
- await loginPage.login("user@example.com", "password123");
71
- await expect(page).toHaveURL("/dashboard");
72
- });
73
-
74
- test("shows error for invalid credentials", async ({ page }) => {
75
- const loginPage = new LoginPage(page);
76
- await loginPage.goto();
77
- await loginPage.login("invalid@example.com", "wrong");
78
- await loginPage.expectError("Invalid credentials");
79
- });
80
- });
81
- ```
82
-
83
- ## Component Objects
84
-
85
- For reusable UI components:
86
-
87
- ```typescript
88
- // components/navbar.component.ts
89
- import { Page, Locator } from "@playwright/test";
90
-
91
- export class NavbarComponent {
92
- readonly container: Locator;
93
- readonly logo: Locator;
94
- readonly searchInput: Locator;
95
- readonly userMenu: Locator;
96
-
97
- constructor(page: Page) {
98
- this.container = page.getByRole("navigation");
99
- this.logo = this.container.getByRole("link", { name: "Home" });
100
- this.searchInput = this.container.getByRole("searchbox");
101
- this.userMenu = this.container.getByRole("button", { name: /user menu/i });
102
- }
103
-
104
- async search(query: string) {
105
- await this.searchInput.fill(query);
106
- await this.searchInput.press("Enter");
107
- }
108
-
109
- async openUserMenu() {
110
- await this.userMenu.click();
111
- }
112
- }
113
- ```
114
-
115
- ```typescript
116
- // components/modal.component.ts
117
- import { Locator, expect } from "@playwright/test";
118
-
119
- export class ModalComponent {
120
- readonly container: Locator;
121
- readonly title: Locator;
122
- readonly closeButton: Locator;
123
- readonly confirmButton: Locator;
124
-
125
- constructor(container: Locator) {
126
- this.container = container;
127
- this.title = container.getByRole("heading");
128
- this.closeButton = container.getByRole("button", { name: "Close" });
129
- this.confirmButton = container.getByRole("button", { name: "Confirm" });
130
- }
131
-
132
- async expectTitle(title: string) {
133
- await expect(this.title).toHaveText(title);
134
- }
135
-
136
- async close() {
137
- await this.closeButton.click();
138
- }
139
-
140
- async confirm() {
141
- await this.confirmButton.click();
142
- }
143
- }
144
- ```
145
-
146
- ## Composition Patterns
147
-
148
- ### Page with Components
149
-
150
- ```typescript
151
- // pages/dashboard.page.ts
152
- import { Page, Locator } from "@playwright/test";
153
- import { NavbarComponent } from "../components/navbar.component";
154
- import { ModalComponent } from "../components/modal.component";
155
-
156
- export class DashboardPage {
157
- readonly page: Page;
158
- readonly navbar: NavbarComponent;
159
- readonly newProjectButton: Locator;
160
-
161
- constructor(page: Page) {
162
- this.page = page;
163
- this.navbar = new NavbarComponent(page);
164
- this.newProjectButton = page.getByRole("button", { name: "New Project" });
165
- }
166
-
167
- async goto() {
168
- await this.page.goto("/dashboard");
169
- }
170
-
171
- async createProject() {
172
- await this.newProjectButton.click();
173
- return new ModalComponent(this.page.getByRole("dialog"));
174
- }
175
- }
176
- ```
177
-
178
- ### Page Navigation
179
-
180
- ```typescript
181
- // pages/base.page.ts
182
- import { Page } from "@playwright/test";
183
-
184
- export abstract class BasePage {
185
- constructor(readonly page: Page) {}
186
-
187
- abstract goto(): Promise<void>;
188
-
189
- async getTitle(): Promise<string> {
190
- return this.page.title();
191
- }
192
- }
193
- ```
194
-
195
- ```typescript
196
- // Return new page object on navigation
197
- export class LoginPage extends BasePage {
198
- async login(email: string, password: string): Promise<DashboardPage> {
199
- await this.emailInput.fill(email);
200
- await this.passwordInput.fill(password);
201
- await this.submitButton.click();
202
- return new DashboardPage(this.page);
203
- }
204
- }
205
-
206
- // Usage
207
- const loginPage = new LoginPage(page);
208
- await loginPage.goto();
209
- const dashboardPage = await loginPage.login("user@example.com", "pass");
210
- await dashboardPage.expectWelcomeMessage();
211
- ```
212
-
213
- ## Factory Functions
214
-
215
- Alternative to classes for simpler pages:
216
-
217
- ```typescript
218
- // pages/login.page.ts
219
- import { Page } from "@playwright/test";
220
-
221
- export function createLoginPage(page: Page) {
222
- const emailInput = page.getByLabel("Email");
223
- const passwordInput = page.getByLabel("Password");
224
- const submitButton = page.getByRole("button", { name: "Sign in" });
225
-
226
- return {
227
- goto: () => page.goto("/login"),
228
- login: async (email: string, password: string) => {
229
- await emailInput.fill(email);
230
- await passwordInput.fill(password);
231
- await submitButton.click();
232
- },
233
- emailInput,
234
- passwordInput,
235
- submitButton,
236
- };
237
- }
238
-
239
- // Usage
240
- const loginPage = createLoginPage(page);
241
- await loginPage.goto();
242
- await loginPage.login("user@example.com", "password");
243
- ```
244
-
245
- ## Best Practices
246
-
247
- ### Do
248
-
249
- - **Keep locators in page objects** - Single source of truth
250
- - **Return new page objects** when navigation occurs
251
- - **Expose elements** for custom assertions in tests
252
- - **Use descriptive method names** - `submitOrder()` not `clickButton()`
253
- - **Keep methods focused** - One action per method
254
-
255
- ### Don't
256
-
257
- - **Don't include assertions in page methods** (usually) - Keep in tests
258
- - **Don't expose implementation details** - Hide complex interactions
259
- - **Don't make page objects too large** - Split into components
260
- - **Don't share state** between page object instances
261
-
262
- ### Directory Structure
263
-
264
- ```
265
- tests/
266
- ├── pages/
267
- │ ├── base.page.ts
268
- │ ├── login.page.ts
269
- │ ├── dashboard.page.ts
270
- │ └── settings.page.ts
271
- ├── components/
272
- │ ├── navbar.component.ts
273
- │ ├── modal.component.ts
274
- │ └── table.component.ts
275
- ├── fixtures/
276
- │ └── pages.fixture.ts
277
- └── specs/
278
- ├── login.spec.ts
279
- └── dashboard.spec.ts
280
- ```
281
-
282
- ### Using with Fixtures
283
-
284
- ```typescript
285
- // fixtures/pages.fixture.ts
286
- import { test as base } from "@playwright/test";
287
- import { LoginPage } from "../pages/login.page";
288
- import { DashboardPage } from "../pages/dashboard.page";
289
-
290
- type Pages = {
291
- loginPage: LoginPage;
292
- dashboardPage: DashboardPage;
293
- };
294
-
295
- export const test = base.extend<Pages>({
296
- loginPage: async ({ page }, use) => {
297
- await use(new LoginPage(page));
298
- },
299
- dashboardPage: async ({ page }, use) => {
300
- await use(new DashboardPage(page));
301
- },
302
- });
303
-
304
- // Usage in tests
305
- test("can login", async ({ loginPage }) => {
306
- await loginPage.goto();
307
- await loginPage.login("user@example.com", "password");
308
- });
309
- ```
310
-
311
- ## Related References
312
-
313
- - **Locator strategies**: See [locators.md](locators.md) for selecting elements
314
- - **Fixtures**: See [fixtures-hooks.md](fixtures-hooks.md) for advanced fixture patterns
315
- - **Test organization**: See [test-suite-structure.md](test-suite-structure.md) for structuring test suites