@gpichot/testing-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +2 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/adapters/playwright.d.ts +41 -0
- package/dist/adapters/playwright.d.ts.map +1 -0
- package/dist/adapters/playwright.js +92 -0
- package/dist/adapters/playwright.js.map +1 -0
- package/dist/adapters/rtl.d.ts +25 -0
- package/dist/adapters/rtl.d.ts.map +1 -0
- package/dist/adapters/rtl.js +261 -0
- package/dist/adapters/rtl.js.map +1 -0
- package/dist/callable.d.ts +7 -0
- package/dist/callable.d.ts.map +1 -0
- package/dist/callable.js +16 -0
- package/dist/callable.js.map +1 -0
- package/dist/enhanced.d.ts +33 -0
- package/dist/enhanced.d.ts.map +1 -0
- package/dist/enhanced.js +146 -0
- package/dist/enhanced.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/widget.d.ts +38 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +40 -0
- package/dist/widget.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright adapter.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { playwright } from "testing-ui/adapters/playwright";
|
|
7
|
+
* import { test } from "@playwright/test";
|
|
8
|
+
*
|
|
9
|
+
* test("example", async ({ page }) => {
|
|
10
|
+
* const locator = playwright(page);
|
|
11
|
+
* const { elements, actions } = myWidget.from(locator);
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import type { Locator } from "../types.js";
|
|
16
|
+
/** Minimal Playwright locator/page surface we depend on (no compile-time dep). */
|
|
17
|
+
interface PwLocatable {
|
|
18
|
+
getByRole(role: string, options?: {
|
|
19
|
+
name?: string | RegExp;
|
|
20
|
+
}): PwLocatable;
|
|
21
|
+
getByLabel(text: string | RegExp): PwLocatable;
|
|
22
|
+
getByPlaceholder(text: string | RegExp): PwLocatable;
|
|
23
|
+
getByText(text: string | RegExp): PwLocatable;
|
|
24
|
+
getByTestId(testId: string): PwLocatable;
|
|
25
|
+
click(): Promise<void>;
|
|
26
|
+
fill(value: string): Promise<void>;
|
|
27
|
+
check(): Promise<void>;
|
|
28
|
+
uncheck(): Promise<void>;
|
|
29
|
+
selectOption(value: string | string[]): Promise<void>;
|
|
30
|
+
clear(): Promise<void>;
|
|
31
|
+
textContent(): Promise<string | null>;
|
|
32
|
+
getAttribute(name: string): Promise<string | null>;
|
|
33
|
+
inputValue(): Promise<string>;
|
|
34
|
+
isVisible(): Promise<boolean>;
|
|
35
|
+
isEnabled(): Promise<boolean>;
|
|
36
|
+
isChecked(): Promise<boolean>;
|
|
37
|
+
all(): Promise<PwLocatable[]>;
|
|
38
|
+
}
|
|
39
|
+
export declare function playwright(page: PwLocatable): Locator;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=playwright.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/adapters/playwright.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAiB,OAAO,EAAkB,MAAM,aAAa,CAAC;AAE1E,kFAAkF;AAClF,UAAU,WAAW;IACpB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IAC3E,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IAC/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACrD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright adapter.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { playwright } from "testing-ui/adapters/playwright";
|
|
7
|
+
* import { test } from "@playwright/test";
|
|
8
|
+
*
|
|
9
|
+
* test("example", async ({ page }) => {
|
|
10
|
+
* const locator = playwright(page);
|
|
11
|
+
* const { elements, actions } = myWidget.from(locator);
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import { asCallable } from "../callable.js";
|
|
16
|
+
export function playwright(page) {
|
|
17
|
+
return asCallable(new PwAdapter(page));
|
|
18
|
+
}
|
|
19
|
+
class PwAdapter {
|
|
20
|
+
pw;
|
|
21
|
+
constructor(pw) {
|
|
22
|
+
this.pw = pw;
|
|
23
|
+
}
|
|
24
|
+
getByRole(role, options) {
|
|
25
|
+
return asCallable(new PwAdapter(this.pw.getByRole(role, options ? { name: options.name } : undefined)));
|
|
26
|
+
}
|
|
27
|
+
getByLabel(text) {
|
|
28
|
+
return asCallable(new PwAdapter(this.pw.getByLabel(text)));
|
|
29
|
+
}
|
|
30
|
+
getByPlaceholder(text) {
|
|
31
|
+
return asCallable(new PwAdapter(this.pw.getByPlaceholder(text)));
|
|
32
|
+
}
|
|
33
|
+
getByText(text) {
|
|
34
|
+
return asCallable(new PwAdapter(this.pw.getByText(text)));
|
|
35
|
+
}
|
|
36
|
+
getByTestId(testId) {
|
|
37
|
+
return asCallable(new PwAdapter(this.pw.getByTestId(testId)));
|
|
38
|
+
}
|
|
39
|
+
get() {
|
|
40
|
+
return this.pw;
|
|
41
|
+
}
|
|
42
|
+
getAll() {
|
|
43
|
+
throw new Error("Playwright getAll() is async — use find() or await locator.get().all() instead");
|
|
44
|
+
}
|
|
45
|
+
query() {
|
|
46
|
+
// Playwright locators are always lazy — query() returns the locator itself
|
|
47
|
+
return this.pw;
|
|
48
|
+
}
|
|
49
|
+
queryAll() {
|
|
50
|
+
throw new Error("Playwright queryAll() is async — use await locator.get().all() instead");
|
|
51
|
+
}
|
|
52
|
+
async find() {
|
|
53
|
+
return this.pw;
|
|
54
|
+
}
|
|
55
|
+
click() {
|
|
56
|
+
return this.pw.click();
|
|
57
|
+
}
|
|
58
|
+
fill(value) {
|
|
59
|
+
return this.pw.fill(value);
|
|
60
|
+
}
|
|
61
|
+
check() {
|
|
62
|
+
return this.pw.check();
|
|
63
|
+
}
|
|
64
|
+
uncheck() {
|
|
65
|
+
return this.pw.uncheck();
|
|
66
|
+
}
|
|
67
|
+
selectOption(value) {
|
|
68
|
+
return this.pw.selectOption(value);
|
|
69
|
+
}
|
|
70
|
+
clear() {
|
|
71
|
+
return this.pw.clear();
|
|
72
|
+
}
|
|
73
|
+
textContent() {
|
|
74
|
+
return this.pw.textContent();
|
|
75
|
+
}
|
|
76
|
+
getAttribute(name) {
|
|
77
|
+
return this.pw.getAttribute(name);
|
|
78
|
+
}
|
|
79
|
+
inputValue() {
|
|
80
|
+
return this.pw.inputValue();
|
|
81
|
+
}
|
|
82
|
+
isVisible() {
|
|
83
|
+
return this.pw.isVisible();
|
|
84
|
+
}
|
|
85
|
+
isEnabled() {
|
|
86
|
+
return this.pw.isEnabled();
|
|
87
|
+
}
|
|
88
|
+
isChecked() {
|
|
89
|
+
return this.pw.isChecked();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=playwright.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../src/adapters/playwright.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Testing Library adapter.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { rtl } from "testing-ui/adapters/rtl";
|
|
7
|
+
* import { render } from "@testing-library/react";
|
|
8
|
+
* import userEvent from "@testing-library/user-event";
|
|
9
|
+
*
|
|
10
|
+
* const user = userEvent.setup();
|
|
11
|
+
* const { container } = render(<MyComponent />);
|
|
12
|
+
* const locator = rtl(container, user);
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import type { Locator } from "../types.js";
|
|
16
|
+
/** Minimal userEvent interface — avoids compile-time dep on @testing-library/user-event */
|
|
17
|
+
interface UserEventLike {
|
|
18
|
+
click(element: Element): Promise<void>;
|
|
19
|
+
type(element: Element, text: string, options?: object): Promise<void>;
|
|
20
|
+
clear(element: Element): Promise<void>;
|
|
21
|
+
selectOptions(element: Element, values: string | string[] | HTMLElement | HTMLElement[]): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare function rtl(container?: HTMLElement, user?: UserEventLike): Locator;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=rtl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtl.d.ts","sourceRoot":"","sources":["../../src/adapters/rtl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAiB,OAAO,EAAkB,MAAM,aAAa,CAAC;AAE1E,2FAA2F;AAC3F,UAAU,aAAa;IACtB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,CACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,WAAW,GAAG,WAAW,EAAE,GACrD,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,wBAAgB,GAAG,CAClB,SAAS,GAAE,WAA2B,EACtC,IAAI,CAAC,EAAE,aAAa,GAClB,OAAO,CAET"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Testing Library adapter.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { rtl } from "testing-ui/adapters/rtl";
|
|
7
|
+
* import { render } from "@testing-library/react";
|
|
8
|
+
* import userEvent from "@testing-library/user-event";
|
|
9
|
+
*
|
|
10
|
+
* const user = userEvent.setup();
|
|
11
|
+
* const { container } = render(<MyComponent />);
|
|
12
|
+
* const locator = rtl(container, user);
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import { asCallable } from "../callable.js";
|
|
16
|
+
export function rtl(container = document.body, user) {
|
|
17
|
+
return asCallable(new RtlLocator(() => container, user));
|
|
18
|
+
}
|
|
19
|
+
class RtlLocator {
|
|
20
|
+
resolve;
|
|
21
|
+
user;
|
|
22
|
+
constructor(resolve, user, query, parentResolve) {
|
|
23
|
+
this.resolve = resolve;
|
|
24
|
+
this.user = user;
|
|
25
|
+
this.query_ = query;
|
|
26
|
+
this.parentResolve = parentResolve;
|
|
27
|
+
}
|
|
28
|
+
// --- Queries (lazy) ---------------------------------------------------
|
|
29
|
+
getByRole(role, options) {
|
|
30
|
+
return this.lazy({ kind: "role", role, options });
|
|
31
|
+
}
|
|
32
|
+
getByLabel(text) {
|
|
33
|
+
return this.lazy({ kind: "label", text });
|
|
34
|
+
}
|
|
35
|
+
getByPlaceholder(text) {
|
|
36
|
+
return this.lazy({ kind: "placeholder", text });
|
|
37
|
+
}
|
|
38
|
+
getByText(text) {
|
|
39
|
+
return this.lazy({ kind: "text", text });
|
|
40
|
+
}
|
|
41
|
+
getByTestId(id) {
|
|
42
|
+
return this.lazy({ kind: "testid", id });
|
|
43
|
+
}
|
|
44
|
+
// --- Resolution -------------------------------------------------------
|
|
45
|
+
get() {
|
|
46
|
+
return this.resolve();
|
|
47
|
+
}
|
|
48
|
+
getAll() {
|
|
49
|
+
return this.resolveAll();
|
|
50
|
+
}
|
|
51
|
+
query() {
|
|
52
|
+
try {
|
|
53
|
+
return this.resolve();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
queryAll() {
|
|
60
|
+
try {
|
|
61
|
+
return this.resolveAll();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async find() {
|
|
68
|
+
return this.resolve();
|
|
69
|
+
}
|
|
70
|
+
// --- Actions ----------------------------------------------------------
|
|
71
|
+
async click() {
|
|
72
|
+
const el = this.resolve();
|
|
73
|
+
if (this.user)
|
|
74
|
+
return this.user.click(el);
|
|
75
|
+
el.click();
|
|
76
|
+
}
|
|
77
|
+
async fill(value) {
|
|
78
|
+
const el = this.resolve();
|
|
79
|
+
if (this.user) {
|
|
80
|
+
await this.user.clear(el);
|
|
81
|
+
return this.user.type(el, value);
|
|
82
|
+
}
|
|
83
|
+
setNativeValue(el, value);
|
|
84
|
+
}
|
|
85
|
+
async check() {
|
|
86
|
+
const el = this.resolve();
|
|
87
|
+
if (!el.checked)
|
|
88
|
+
await this.click();
|
|
89
|
+
}
|
|
90
|
+
async uncheck() {
|
|
91
|
+
const el = this.resolve();
|
|
92
|
+
if (el.checked)
|
|
93
|
+
await this.click();
|
|
94
|
+
}
|
|
95
|
+
async selectOption(value) {
|
|
96
|
+
const el = this.resolve();
|
|
97
|
+
if (this.user)
|
|
98
|
+
return this.user.selectOptions(el, value);
|
|
99
|
+
const values = Array.isArray(value) ? value : [value];
|
|
100
|
+
for (const opt of Array.from(el.options)) {
|
|
101
|
+
opt.selected = values.includes(opt.value);
|
|
102
|
+
}
|
|
103
|
+
el.dispatchEvent(new Event("change", { bubbles: true }));
|
|
104
|
+
}
|
|
105
|
+
async clear() {
|
|
106
|
+
const el = this.resolve();
|
|
107
|
+
if (this.user)
|
|
108
|
+
return this.user.clear(el);
|
|
109
|
+
setNativeValue(el, "");
|
|
110
|
+
}
|
|
111
|
+
// --- State ------------------------------------------------------------
|
|
112
|
+
async textContent() {
|
|
113
|
+
return this.resolve().textContent;
|
|
114
|
+
}
|
|
115
|
+
async getAttribute(name) {
|
|
116
|
+
return this.resolve().getAttribute(name);
|
|
117
|
+
}
|
|
118
|
+
async inputValue() {
|
|
119
|
+
return this.resolve().value;
|
|
120
|
+
}
|
|
121
|
+
async isVisible() {
|
|
122
|
+
const el = this.resolve();
|
|
123
|
+
const style = window.getComputedStyle(el);
|
|
124
|
+
return (style.display !== "none" &&
|
|
125
|
+
style.visibility !== "hidden" &&
|
|
126
|
+
style.opacity !== "0");
|
|
127
|
+
}
|
|
128
|
+
async isEnabled() {
|
|
129
|
+
return !this.resolve().disabled;
|
|
130
|
+
}
|
|
131
|
+
async isChecked() {
|
|
132
|
+
return this.resolve().checked;
|
|
133
|
+
}
|
|
134
|
+
// --- Internal ---------------------------------------------------------
|
|
135
|
+
lazy(query) {
|
|
136
|
+
return asCallable(new RtlLocator(() => runQuery(this.resolve(), query), this.user, query, this.resolve));
|
|
137
|
+
}
|
|
138
|
+
resolveAll() {
|
|
139
|
+
if (!this.query_ || !this.parentResolve) {
|
|
140
|
+
return [this.resolve()];
|
|
141
|
+
}
|
|
142
|
+
return runQueryAll(this.parentResolve(), this.query_);
|
|
143
|
+
}
|
|
144
|
+
query_;
|
|
145
|
+
parentResolve;
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Minimal DOM query helpers (no @testing-library/dom dependency)
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
function matches(actual, expected) {
|
|
151
|
+
return typeof expected === "string"
|
|
152
|
+
? actual === expected
|
|
153
|
+
: expected.test(actual);
|
|
154
|
+
}
|
|
155
|
+
function runQuery(root, q) {
|
|
156
|
+
const results = runQueryAll(root, q);
|
|
157
|
+
if (results.length === 0) {
|
|
158
|
+
throwNotFound(q);
|
|
159
|
+
}
|
|
160
|
+
return results[0];
|
|
161
|
+
}
|
|
162
|
+
function runQueryAll(root, q) {
|
|
163
|
+
switch (q.kind) {
|
|
164
|
+
case "role":
|
|
165
|
+
return findAllByRole(root, q.role, q.options);
|
|
166
|
+
case "label":
|
|
167
|
+
return findAllByLabel(root, q.text);
|
|
168
|
+
case "placeholder":
|
|
169
|
+
return findAllByAttr(root, "placeholder", q.text);
|
|
170
|
+
case "text":
|
|
171
|
+
return findAllByText(root, q.text);
|
|
172
|
+
case "testid":
|
|
173
|
+
return findAllByAttr(root, "data-testid", q.id);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function throwNotFound(q) {
|
|
177
|
+
switch (q.kind) {
|
|
178
|
+
case "role":
|
|
179
|
+
throw new Error(`Unable to find element with role "${q.role}"${q.options?.name ? ` and name "${q.options.name}"` : ""}`);
|
|
180
|
+
case "label":
|
|
181
|
+
throw new Error(`Unable to find element with label "${q.text}"`);
|
|
182
|
+
case "text":
|
|
183
|
+
throw new Error(`Unable to find element with text "${q.text}"`);
|
|
184
|
+
case "placeholder":
|
|
185
|
+
throw new Error(`Unable to find element with placeholder "${q.text}"`);
|
|
186
|
+
case "testid":
|
|
187
|
+
throw new Error(`Unable to find element with data-testid "${q.id}"`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Map common implicit roles to selectors
|
|
191
|
+
const implicitRoles = {
|
|
192
|
+
button: 'button, [role="button"], input[type="button"], input[type="submit"]',
|
|
193
|
+
textbox: 'input:not([type]), input[type="text"], textarea, [role="textbox"]',
|
|
194
|
+
checkbox: 'input[type="checkbox"], [role="checkbox"]',
|
|
195
|
+
radio: 'input[type="radio"], [role="radio"]',
|
|
196
|
+
link: 'a[href], [role="link"]',
|
|
197
|
+
heading: "h1, h2, h3, h4, h5, h6, [role=heading]",
|
|
198
|
+
list: 'ul, ol, [role="list"]',
|
|
199
|
+
listitem: 'li, [role="listitem"]',
|
|
200
|
+
combobox: 'select, [role="combobox"]',
|
|
201
|
+
dialog: 'dialog, [role="dialog"]',
|
|
202
|
+
img: 'img[alt], [role="img"]',
|
|
203
|
+
};
|
|
204
|
+
function findAllByRole(root, role, options) {
|
|
205
|
+
const selector = implicitRoles[role] ?? `[role="${role}"]`;
|
|
206
|
+
const results = [];
|
|
207
|
+
for (const el of Array.from(root.querySelectorAll(selector))) {
|
|
208
|
+
if (options?.name !== undefined) {
|
|
209
|
+
const accessible = el.getAttribute("aria-label") ?? el.textContent?.trim() ?? "";
|
|
210
|
+
if (!matches(accessible, options.name))
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
results.push(el);
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
function findAllByLabel(root, text) {
|
|
218
|
+
const results = [];
|
|
219
|
+
for (const label of Array.from(root.querySelectorAll("label"))) {
|
|
220
|
+
if (!matches(label.textContent?.trim() ?? "", text))
|
|
221
|
+
continue;
|
|
222
|
+
const forId = label.getAttribute("for");
|
|
223
|
+
if (forId) {
|
|
224
|
+
const el = root.querySelector(`#${forId}`);
|
|
225
|
+
if (el)
|
|
226
|
+
results.push(el);
|
|
227
|
+
}
|
|
228
|
+
const input = label.querySelector("input, select, textarea");
|
|
229
|
+
if (input)
|
|
230
|
+
results.push(input);
|
|
231
|
+
}
|
|
232
|
+
for (const el of Array.from(root.querySelectorAll("*"))) {
|
|
233
|
+
const aria = el.getAttribute("aria-label");
|
|
234
|
+
if (aria && matches(aria, text) && !results.includes(el))
|
|
235
|
+
results.push(el);
|
|
236
|
+
}
|
|
237
|
+
return results;
|
|
238
|
+
}
|
|
239
|
+
function findAllByText(root, text) {
|
|
240
|
+
const results = [];
|
|
241
|
+
for (const el of Array.from(root.querySelectorAll("*"))) {
|
|
242
|
+
if (el.children.length === 0 && matches(el.textContent?.trim() ?? "", text))
|
|
243
|
+
results.push(el);
|
|
244
|
+
}
|
|
245
|
+
return results;
|
|
246
|
+
}
|
|
247
|
+
function findAllByAttr(root, attr, value) {
|
|
248
|
+
const results = [];
|
|
249
|
+
for (const el of Array.from(root.querySelectorAll(`[${attr}]`))) {
|
|
250
|
+
if (matches(el.getAttribute(attr) ?? "", value))
|
|
251
|
+
results.push(el);
|
|
252
|
+
}
|
|
253
|
+
return results;
|
|
254
|
+
}
|
|
255
|
+
function setNativeValue(el, value) {
|
|
256
|
+
const desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), "value");
|
|
257
|
+
desc?.set?.call(el, value);
|
|
258
|
+
el.dispatchEvent(new Event("input", { bubbles: true }));
|
|
259
|
+
el.dispatchEvent(new Event("change", { bubbles: true }));
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=rtl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtl.js","sourceRoot":"","sources":["../../src/adapters/rtl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Locator, LocatorMethods } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Wrap a LocatorMethods implementation so it is callable.
|
|
4
|
+
* Calling the returned object directly is shorthand for `.get()`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function asCallable(impl: LocatorMethods): Locator;
|
|
7
|
+
//# sourceMappingURL=callable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callable.d.ts","sourceRoot":"","sources":["../src/callable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAUxD"}
|
package/dist/callable.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrap a LocatorMethods implementation so it is callable.
|
|
3
|
+
* Calling the returned object directly is shorthand for `.get()`.
|
|
4
|
+
*/
|
|
5
|
+
export function asCallable(impl) {
|
|
6
|
+
const fn = (() => impl.get());
|
|
7
|
+
return new Proxy(fn, {
|
|
8
|
+
get(_target, prop, receiver) {
|
|
9
|
+
if (prop in impl) {
|
|
10
|
+
return impl[prop];
|
|
11
|
+
}
|
|
12
|
+
return Reflect.get(fn, prop, receiver);
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=callable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callable.js","sourceRoot":"","sources":["../src/callable.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAoB;IAC9C,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAuB,CAAC;IACpD,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;QACpB,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ;YAC1B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBAClB,OAAQ,IAAoD,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ByRoleOptions, Locator } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extended locator with role shortcuts and concise aliases.
|
|
4
|
+
* Adapters implement the base `Locator`; these shortcuts are added
|
|
5
|
+
* automatically by `widget()`.
|
|
6
|
+
*/
|
|
7
|
+
export interface LocatorWith extends Locator {
|
|
8
|
+
byRole(role: string, options?: ByRoleOptions): LocatorWith;
|
|
9
|
+
byLabel(text: string | RegExp): LocatorWith;
|
|
10
|
+
byPlaceholder(text: string | RegExp): LocatorWith;
|
|
11
|
+
byText(text: string | RegExp): LocatorWith;
|
|
12
|
+
byTestId(testId: string): LocatorWith;
|
|
13
|
+
button(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
14
|
+
link(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
15
|
+
textbox(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
16
|
+
checkbox(options?: Pick<ByRoleOptions, "name" | "checked">): LocatorWith;
|
|
17
|
+
radio(options?: Pick<ByRoleOptions, "name" | "checked">): LocatorWith;
|
|
18
|
+
combobox(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
19
|
+
heading(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
20
|
+
dialog(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
21
|
+
list(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
22
|
+
listitem(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
23
|
+
img(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
24
|
+
tab(options?: Pick<ByRoleOptions, "name" | "selected">): LocatorWith;
|
|
25
|
+
tabpanel(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
26
|
+
navigation(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
27
|
+
region(options?: Pick<ByRoleOptions, "name">): LocatorWith;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Wrap a base Locator with shortcut methods.
|
|
31
|
+
*/
|
|
32
|
+
export declare function enhance(base: Locator): LocatorWith;
|
|
33
|
+
//# sourceMappingURL=enhanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced.d.ts","sourceRoot":"","sources":["../src/enhanced.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,OAAO;IAE3C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,WAAW,CAAC;IAC3D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IAC5C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IAClD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;IAGtC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,WAAW,CAAC;IACzE,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,WAAW,CAAC;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC7D,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC5D,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC7D,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IACxD,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC7D,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC;CAC3D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CAElD"}
|
package/dist/enhanced.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { asCallable } from "./callable.js";
|
|
2
|
+
/**
|
|
3
|
+
* Wrap a base Locator with shortcut methods.
|
|
4
|
+
*/
|
|
5
|
+
export function enhance(base) {
|
|
6
|
+
return asCallable(new LocatorProxy(base));
|
|
7
|
+
}
|
|
8
|
+
class LocatorProxy {
|
|
9
|
+
base;
|
|
10
|
+
constructor(base) {
|
|
11
|
+
this.base = base;
|
|
12
|
+
}
|
|
13
|
+
// --- Base Locator (delegate & wrap) ------------------------------------
|
|
14
|
+
wrap(locator) {
|
|
15
|
+
return asCallable(new LocatorProxy(locator));
|
|
16
|
+
}
|
|
17
|
+
getByRole(role, options) {
|
|
18
|
+
return this.wrap(this.base.getByRole(role, options));
|
|
19
|
+
}
|
|
20
|
+
getByLabel(text) {
|
|
21
|
+
return this.wrap(this.base.getByLabel(text));
|
|
22
|
+
}
|
|
23
|
+
getByPlaceholder(text) {
|
|
24
|
+
return this.wrap(this.base.getByPlaceholder(text));
|
|
25
|
+
}
|
|
26
|
+
getByText(text) {
|
|
27
|
+
return this.wrap(this.base.getByText(text));
|
|
28
|
+
}
|
|
29
|
+
getByTestId(testId) {
|
|
30
|
+
return this.wrap(this.base.getByTestId(testId));
|
|
31
|
+
}
|
|
32
|
+
get() {
|
|
33
|
+
return this.base.get();
|
|
34
|
+
}
|
|
35
|
+
getAll() {
|
|
36
|
+
return this.base.getAll();
|
|
37
|
+
}
|
|
38
|
+
query() {
|
|
39
|
+
return this.base.query();
|
|
40
|
+
}
|
|
41
|
+
queryAll() {
|
|
42
|
+
return this.base.queryAll();
|
|
43
|
+
}
|
|
44
|
+
find() {
|
|
45
|
+
return this.base.find();
|
|
46
|
+
}
|
|
47
|
+
click() {
|
|
48
|
+
return this.base.click();
|
|
49
|
+
}
|
|
50
|
+
fill(value) {
|
|
51
|
+
return this.base.fill(value);
|
|
52
|
+
}
|
|
53
|
+
check() {
|
|
54
|
+
return this.base.check();
|
|
55
|
+
}
|
|
56
|
+
uncheck() {
|
|
57
|
+
return this.base.uncheck();
|
|
58
|
+
}
|
|
59
|
+
selectOption(value) {
|
|
60
|
+
return this.base.selectOption(value);
|
|
61
|
+
}
|
|
62
|
+
clear() {
|
|
63
|
+
return this.base.clear();
|
|
64
|
+
}
|
|
65
|
+
textContent() {
|
|
66
|
+
return this.base.textContent();
|
|
67
|
+
}
|
|
68
|
+
getAttribute(name) {
|
|
69
|
+
return this.base.getAttribute(name);
|
|
70
|
+
}
|
|
71
|
+
inputValue() {
|
|
72
|
+
return this.base.inputValue();
|
|
73
|
+
}
|
|
74
|
+
isVisible() {
|
|
75
|
+
return this.base.isVisible();
|
|
76
|
+
}
|
|
77
|
+
isEnabled() {
|
|
78
|
+
return this.base.isEnabled();
|
|
79
|
+
}
|
|
80
|
+
isChecked() {
|
|
81
|
+
return this.base.isChecked();
|
|
82
|
+
}
|
|
83
|
+
// --- Short aliases ----------------------------------------------------
|
|
84
|
+
byRole(role, options) {
|
|
85
|
+
return this.getByRole(role, options);
|
|
86
|
+
}
|
|
87
|
+
byLabel(text) {
|
|
88
|
+
return this.getByLabel(text);
|
|
89
|
+
}
|
|
90
|
+
byPlaceholder(text) {
|
|
91
|
+
return this.getByPlaceholder(text);
|
|
92
|
+
}
|
|
93
|
+
byText(text) {
|
|
94
|
+
return this.getByText(text);
|
|
95
|
+
}
|
|
96
|
+
byTestId(testId) {
|
|
97
|
+
return this.getByTestId(testId);
|
|
98
|
+
}
|
|
99
|
+
// --- Role shortcuts ---------------------------------------------------
|
|
100
|
+
button(options) {
|
|
101
|
+
return this.getByRole("button", options);
|
|
102
|
+
}
|
|
103
|
+
link(options) {
|
|
104
|
+
return this.getByRole("link", options);
|
|
105
|
+
}
|
|
106
|
+
textbox(options) {
|
|
107
|
+
return this.getByRole("textbox", options);
|
|
108
|
+
}
|
|
109
|
+
checkbox(options) {
|
|
110
|
+
return this.getByRole("checkbox", options);
|
|
111
|
+
}
|
|
112
|
+
radio(options) {
|
|
113
|
+
return this.getByRole("radio", options);
|
|
114
|
+
}
|
|
115
|
+
combobox(options) {
|
|
116
|
+
return this.getByRole("combobox", options);
|
|
117
|
+
}
|
|
118
|
+
heading(options) {
|
|
119
|
+
return this.getByRole("heading", options);
|
|
120
|
+
}
|
|
121
|
+
dialog(options) {
|
|
122
|
+
return this.getByRole("dialog", options);
|
|
123
|
+
}
|
|
124
|
+
list(options) {
|
|
125
|
+
return this.getByRole("list", options);
|
|
126
|
+
}
|
|
127
|
+
listitem(options) {
|
|
128
|
+
return this.getByRole("listitem", options);
|
|
129
|
+
}
|
|
130
|
+
img(options) {
|
|
131
|
+
return this.getByRole("img", options);
|
|
132
|
+
}
|
|
133
|
+
tab(options) {
|
|
134
|
+
return this.getByRole("tab", options);
|
|
135
|
+
}
|
|
136
|
+
tabpanel(options) {
|
|
137
|
+
return this.getByRole("tabpanel", options);
|
|
138
|
+
}
|
|
139
|
+
navigation(options) {
|
|
140
|
+
return this.getByRole("navigation", options);
|
|
141
|
+
}
|
|
142
|
+
region(options) {
|
|
143
|
+
return this.getByRole("region", options);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=enhanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced.js","sourceRoot":"","sources":["../src/enhanced.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { widget } from "./widget.js";
|
|
2
|
+
export type { WidgetDef } from "./widget.js";
|
|
3
|
+
export type { Locator, LocatorMethods, ByRoleOptions } from "./types.js";
|
|
4
|
+
export type { LocatorWith } from "./enhanced.js";
|
|
5
|
+
export { enhance } from "./enhanced.js";
|
|
6
|
+
export { asCallable } from "./callable.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Methods available on a locator — implemented by adapter classes.
|
|
3
|
+
* Use {@link Locator} for the public-facing callable type.
|
|
4
|
+
*/
|
|
5
|
+
export interface LocatorMethods {
|
|
6
|
+
getByRole(role: string, options?: ByRoleOptions): Locator;
|
|
7
|
+
getByLabel(text: string | RegExp): Locator;
|
|
8
|
+
getByPlaceholder(text: string | RegExp): Locator;
|
|
9
|
+
getByText(text: string | RegExp): Locator;
|
|
10
|
+
getByTestId(testId: string): Locator;
|
|
11
|
+
/** Resolve to the native element/locator. Throws if not found. */
|
|
12
|
+
get(): unknown;
|
|
13
|
+
/** Resolve all matching native elements/locators. Throws if none found. */
|
|
14
|
+
getAll(): unknown[];
|
|
15
|
+
/** Resolve to the native element/locator, or null if not found. */
|
|
16
|
+
query(): unknown | null;
|
|
17
|
+
/** Resolve all matching native elements/locators (empty array if none). */
|
|
18
|
+
queryAll(): unknown[];
|
|
19
|
+
/** Async resolution — waits for the element to appear. */
|
|
20
|
+
find(): Promise<unknown>;
|
|
21
|
+
click(): Promise<void>;
|
|
22
|
+
fill(value: string): Promise<void>;
|
|
23
|
+
check(): Promise<void>;
|
|
24
|
+
uncheck(): Promise<void>;
|
|
25
|
+
selectOption(value: string | string[]): Promise<void>;
|
|
26
|
+
clear(): Promise<void>;
|
|
27
|
+
textContent(): Promise<string | null>;
|
|
28
|
+
getAttribute(name: string): Promise<string | null>;
|
|
29
|
+
inputValue(): Promise<string>;
|
|
30
|
+
isVisible(): Promise<boolean>;
|
|
31
|
+
isEnabled(): Promise<boolean>;
|
|
32
|
+
isChecked(): Promise<boolean>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A callable locator. Calling it directly is shorthand for `.get()`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const heading = locator.getByRole("heading");
|
|
40
|
+
* heading() // → get() — returns the native element
|
|
41
|
+
* heading.get() // same as above
|
|
42
|
+
* heading.query() // returns null instead of throwing
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export interface Locator extends LocatorMethods {
|
|
46
|
+
/** Shorthand for get(). */
|
|
47
|
+
(): unknown;
|
|
48
|
+
}
|
|
49
|
+
export interface ByRoleOptions {
|
|
50
|
+
name?: string | RegExp;
|
|
51
|
+
checked?: boolean;
|
|
52
|
+
disabled?: boolean;
|
|
53
|
+
expanded?: boolean;
|
|
54
|
+
selected?: boolean;
|
|
55
|
+
pressed?: boolean;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAE9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;IAC1D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAGrC,kEAAkE;IAClE,GAAG,IAAI,OAAO,CAAC;IACf,2EAA2E;IAC3E,MAAM,IAAI,OAAO,EAAE,CAAC;IACpB,mEAAmE;IACnE,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,IAAI,OAAO,EAAE,CAAC;IACtB,0DAA0D;IAC1D,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAGzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,OAAQ,SAAQ,cAAc;IAC9C,2BAA2B;IAC3B,IAAI,OAAO,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/widget.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { LocatorWith } from "./enhanced.js";
|
|
2
|
+
import type { Locator } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Defines a reusable, runner-agnostic widget.
|
|
5
|
+
*
|
|
6
|
+
* The factory receives a {@link LocatorWith} — an enhanced locator with
|
|
7
|
+
* role shortcuts like `button()`, `textbox()`, `heading()` and short
|
|
8
|
+
* aliases like `byRole()`, `byLabel()`, `byText()`.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const loginForm = widget((l) => ({
|
|
13
|
+
* elements: {
|
|
14
|
+
* email: () => l.byLabel("Email"),
|
|
15
|
+
* password: () => l.byLabel("Password"),
|
|
16
|
+
* submit: () => l.button({ name: "Sign in" }),
|
|
17
|
+
* },
|
|
18
|
+
* actions: {
|
|
19
|
+
* login: async (email: string, password: string) => {
|
|
20
|
+
* await l.byLabel("Email").fill(email);
|
|
21
|
+
* await l.byLabel("Password").fill(password);
|
|
22
|
+
* await l.button({ name: "Sign in" }).click();
|
|
23
|
+
* },
|
|
24
|
+
* },
|
|
25
|
+
* }));
|
|
26
|
+
*
|
|
27
|
+
* // Connect to RTL
|
|
28
|
+
* const { elements, actions } = loginForm.from(rtl(container, user));
|
|
29
|
+
*
|
|
30
|
+
* // Or Playwright
|
|
31
|
+
* const { elements, actions } = loginForm.from(playwright(page));
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function widget<T>(factory: (locator: LocatorWith) => T): {
|
|
35
|
+
from(locator: Locator): T;
|
|
36
|
+
};
|
|
37
|
+
export type WidgetDef<T> = ReturnType<typeof widget<T>>;
|
|
38
|
+
//# sourceMappingURL=widget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC;kBAE9C,OAAO,GAAG,CAAC;EAI1B;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/widget.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { enhance } from "./enhanced.js";
|
|
2
|
+
/**
|
|
3
|
+
* Defines a reusable, runner-agnostic widget.
|
|
4
|
+
*
|
|
5
|
+
* The factory receives a {@link LocatorWith} — an enhanced locator with
|
|
6
|
+
* role shortcuts like `button()`, `textbox()`, `heading()` and short
|
|
7
|
+
* aliases like `byRole()`, `byLabel()`, `byText()`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const loginForm = widget((l) => ({
|
|
12
|
+
* elements: {
|
|
13
|
+
* email: () => l.byLabel("Email"),
|
|
14
|
+
* password: () => l.byLabel("Password"),
|
|
15
|
+
* submit: () => l.button({ name: "Sign in" }),
|
|
16
|
+
* },
|
|
17
|
+
* actions: {
|
|
18
|
+
* login: async (email: string, password: string) => {
|
|
19
|
+
* await l.byLabel("Email").fill(email);
|
|
20
|
+
* await l.byLabel("Password").fill(password);
|
|
21
|
+
* await l.button({ name: "Sign in" }).click();
|
|
22
|
+
* },
|
|
23
|
+
* },
|
|
24
|
+
* }));
|
|
25
|
+
*
|
|
26
|
+
* // Connect to RTL
|
|
27
|
+
* const { elements, actions } = loginForm.from(rtl(container, user));
|
|
28
|
+
*
|
|
29
|
+
* // Or Playwright
|
|
30
|
+
* const { elements, actions } = loginForm.from(playwright(page));
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function widget(factory) {
|
|
34
|
+
return {
|
|
35
|
+
from(locator) {
|
|
36
|
+
return factory(enhance(locator));
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,MAAM,CAAI,OAAoC;IAC7D,OAAO;QACN,IAAI,CAAC,OAAgB;YACpB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAClC,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gpichot/testing-ui",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Widget Object Model - framework and runner agnostic UI testing abstractions",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./adapters/rtl": {
|
|
14
|
+
"types": "./dist/adapters/rtl.d.ts",
|
|
15
|
+
"import": "./dist/adapters/rtl.js"
|
|
16
|
+
},
|
|
17
|
+
"./adapters/playwright": {
|
|
18
|
+
"types": "./dist/adapters/playwright.d.ts",
|
|
19
|
+
"import": "./dist/adapters/playwright.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"keywords": [
|
|
26
|
+
"testing",
|
|
27
|
+
"widget-object-model",
|
|
28
|
+
"page-object-model",
|
|
29
|
+
"react-testing-library",
|
|
30
|
+
"playwright",
|
|
31
|
+
"ui-testing"
|
|
32
|
+
],
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@testing-library/react": ">=14",
|
|
36
|
+
"@playwright/test": ">=1"
|
|
37
|
+
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"@testing-library/react": {
|
|
40
|
+
"optional": true
|
|
41
|
+
},
|
|
42
|
+
"@playwright/test": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
48
|
+
"jsdom": "^26.0.0",
|
|
49
|
+
"vitest": "^3.0.0",
|
|
50
|
+
"typescript": "^5.7.0"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc --project tsconfig.build.json",
|
|
54
|
+
"test": "vitest run"
|
|
55
|
+
}
|
|
56
|
+
}
|