@mobilewright/core 0.0.41 → 0.0.43
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/device.d.ts +7 -1
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +17 -2
- package/dist/device.js.map +1 -1
- package/dist/device.test.d.ts +2 -0
- package/dist/device.test.d.ts.map +1 -0
- package/dist/device.test.js +39 -0
- package/dist/device.test.js.map +1 -0
- package/dist/expect.d.ts +82 -11
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +181 -22
- package/dist/expect.js.map +1 -1
- package/dist/expect.test.js +17 -0
- package/dist/expect.test.js.map +1 -1
- package/dist/fake-webview-session.d.ts +14 -0
- package/dist/fake-webview-session.d.ts.map +1 -0
- package/dist/fake-webview-session.js +26 -0
- package/dist/fake-webview-session.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/locator.d.ts +26 -5
- package/dist/locator.d.ts.map +1 -1
- package/dist/locator.js +31 -10
- package/dist/locator.js.map +1 -1
- package/dist/locator.test.js +213 -0
- package/dist/locator.test.js.map +1 -1
- package/dist/page.d.ts +52 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +226 -0
- package/dist/page.js.map +1 -0
- package/dist/page.test.d.ts +2 -0
- package/dist/page.test.d.ts.map +1 -0
- package/dist/page.test.js +263 -0
- package/dist/page.test.js.map +1 -0
- package/dist/playwright-engine.d.ts +23 -0
- package/dist/playwright-engine.d.ts.map +1 -0
- package/dist/playwright-engine.js +79 -0
- package/dist/playwright-engine.js.map +1 -0
- package/dist/playwright-engine.test.d.ts +2 -0
- package/dist/playwright-engine.test.d.ts.map +1 -0
- package/dist/playwright-engine.test.js +45 -0
- package/dist/playwright-engine.test.js.map +1 -0
- package/dist/query-engine.d.ts +19 -0
- package/dist/query-engine.d.ts.map +1 -1
- package/dist/query-engine.js +80 -0
- package/dist/query-engine.js.map +1 -1
- package/dist/query-engine.test.js +187 -1
- package/dist/query-engine.test.js.map +1 -1
- package/dist/screen.d.ts +11 -1
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +16 -0
- package/dist/screen.js.map +1 -1
- package/dist/screen.test.d.ts +2 -0
- package/dist/screen.test.d.ts.map +1 -0
- package/dist/screen.test.js +69 -0
- package/dist/screen.test.js.map +1 -0
- package/dist/stackTrace.d.ts +3 -0
- package/dist/stackTrace.d.ts.map +1 -1
- package/dist/stackTrace.js +10 -0
- package/dist/stackTrace.js.map +1 -1
- package/dist/stackTrace.test.d.ts +2 -0
- package/dist/stackTrace.test.d.ts.map +1 -0
- package/dist/stackTrace.test.js +43 -0
- package/dist/stackTrace.test.js.map +1 -0
- package/dist/web-expect-matcher.d.ts +29 -0
- package/dist/web-expect-matcher.d.ts.map +1 -0
- package/dist/web-expect-matcher.js +23 -0
- package/dist/web-expect-matcher.js.map +1 -0
- package/dist/web-expect-matcher.test.d.ts +2 -0
- package/dist/web-expect-matcher.test.d.ts.map +1 -0
- package/dist/web-expect-matcher.test.js +21 -0
- package/dist/web-expect-matcher.test.js.map +1 -0
- package/dist/web-expect.test.d.ts +2 -0
- package/dist/web-expect.test.d.ts.map +1 -0
- package/dist/web-expect.test.js +93 -0
- package/dist/web-expect.test.js.map +1 -0
- package/dist/web-locator-pwexpect.test.d.ts +2 -0
- package/dist/web-locator-pwexpect.test.d.ts.map +1 -0
- package/dist/web-locator-pwexpect.test.js +36 -0
- package/dist/web-locator-pwexpect.test.js.map +1 -0
- package/dist/web-locator-reinjection.test.d.ts +2 -0
- package/dist/web-locator-reinjection.test.d.ts.map +1 -0
- package/dist/web-locator-reinjection.test.js +83 -0
- package/dist/web-locator-reinjection.test.js.map +1 -0
- package/dist/web-locator.d.ts +120 -0
- package/dist/web-locator.d.ts.map +1 -0
- package/dist/web-locator.js +332 -0
- package/dist/web-locator.js.map +1 -0
- package/dist/web-locator.test.d.ts +2 -0
- package/dist/web-locator.test.d.ts.map +1 -0
- package/dist/web-locator.test.js +424 -0
- package/dist/web-locator.test.js.map +1 -0
- package/dist/webview-locator.d.ts +14 -0
- package/dist/webview-locator.d.ts.map +1 -0
- package/dist/webview-locator.js +95 -0
- package/dist/webview-locator.js.map +1 -0
- package/dist/webview-locator.test.d.ts +2 -0
- package/dist/webview-locator.test.d.ts.map +1 -0
- package/dist/webview-locator.test.js +203 -0
- package/dist/webview-locator.test.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-expect-matcher.d.ts","sourceRoot":"","sources":["../src/web-expect-matcher.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAGD,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,KAAK,GAAE;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5F,iBAAiB,CAKnB;AAID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM,CASvF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Builds the calling convention for Playwright's injected expect() matcher.
|
|
2
|
+
// Verified against playwright-core@1.58.2: injected.expect(element, params,
|
|
3
|
+
// elements) returns { matches, received, missingReceived }; pass = matches !== isNot.
|
|
4
|
+
// Build an ExpectedTextValue from a string or RegExp, plus optional match flags.
|
|
5
|
+
export function textValue(value, flags = {}) {
|
|
6
|
+
if (value instanceof RegExp) {
|
|
7
|
+
return { regexSource: value.source, regexFlags: value.flags, ...flags };
|
|
8
|
+
}
|
|
9
|
+
return { string: value, ...flags };
|
|
10
|
+
}
|
|
11
|
+
// A single self-contained evaluate: resolve the selector, run the injected
|
|
12
|
+
// matcher, return its serializable verdict. No JSHandles needed.
|
|
13
|
+
export function buildExpectEvaluate(selector, params) {
|
|
14
|
+
const sel = JSON.stringify(selector);
|
|
15
|
+
const opts = JSON.stringify(params);
|
|
16
|
+
return `(async () => {
|
|
17
|
+
const is = window.__mwInjected;
|
|
18
|
+
const elements = is.querySelectorAll(is.parseSelector(${sel}), document);
|
|
19
|
+
const r = await is.expect(elements[0], ${opts}, elements);
|
|
20
|
+
return { matches: r.matches, received: r.received, missingReceived: r.missingReceived };
|
|
21
|
+
})()`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=web-expect-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-expect-matcher.js","sourceRoot":"","sources":["../src/web-expect-matcher.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,sFAAsF;AA2BtF,iFAAiF;AACjF,MAAM,UAAU,SAAS,CACvB,KAAsB,EACtB,QAA2F,EAAE;IAE7F,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,2EAA2E;AAC3E,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,MAAyB;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO;;4DAEmD,GAAG;6CAClB,IAAI;;OAE1C,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-expect-matcher.test.d.ts","sourceRoot":"","sources":["../src/web-expect-matcher.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { test, expect as playwrightExpect } from '@playwright/test';
|
|
2
|
+
import { buildExpectEvaluate, textValue } from './web-expect-matcher.js';
|
|
3
|
+
test.describe('web-expect-matcher', () => {
|
|
4
|
+
test('textValue builds a string matcher with flags', () => {
|
|
5
|
+
playwrightExpect(textValue('Hi', { normalizeWhiteSpace: true }))
|
|
6
|
+
.toEqual({ string: 'Hi', normalizeWhiteSpace: true });
|
|
7
|
+
});
|
|
8
|
+
test('textValue builds a regex matcher from a RegExp', () => {
|
|
9
|
+
playwrightExpect(textValue(/hi/i)).toEqual({ regexSource: 'hi', regexFlags: 'i' });
|
|
10
|
+
});
|
|
11
|
+
test('buildExpectEvaluate calls window.__mwInjected.expect with the params', () => {
|
|
12
|
+
const params = { expression: 'to.have.text', expectedText: [textValue('Hi')], isNot: false, timeout: 0 };
|
|
13
|
+
const js = buildExpectEvaluate('.btn', params);
|
|
14
|
+
playwrightExpect(js).toContain('window.__mwInjected');
|
|
15
|
+
playwrightExpect(js).toContain('is.expect(elements[0],');
|
|
16
|
+
playwrightExpect(js).toContain('is.querySelectorAll(is.parseSelector(".btn")');
|
|
17
|
+
playwrightExpect(js).toContain('"expression":"to.have.text"');
|
|
18
|
+
playwrightExpect(js).toContain('"string":"Hi"');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=web-expect-matcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-expect-matcher.test.js","sourceRoot":"","sources":["../src/web-expect-matcher.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAA0B,MAAM,yBAAyB,CAAC;AAEjG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;aAC7D,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAsB,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5H,MAAM,EAAE,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtD,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACzD,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;QAC/E,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAC9D,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-expect.test.d.ts","sourceRoot":"","sources":["../src/web-expect.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { test, expect as playwrightExpect } from '@playwright/test';
|
|
2
|
+
import { WebLocator } from './web-locator.js';
|
|
3
|
+
import { expect } from './expect.js';
|
|
4
|
+
import { fakeWebViewSession } from './fake-webview-session.js';
|
|
5
|
+
// Fake session whose evaluate() always returns the given injected-expect verdict.
|
|
6
|
+
function sessionMatching(verdict) {
|
|
7
|
+
return fakeWebViewSession({ evaluateAlways: verdict, url: '', title: '' });
|
|
8
|
+
}
|
|
9
|
+
function webLocator(session) {
|
|
10
|
+
return new WebLocator(session, '.btn');
|
|
11
|
+
}
|
|
12
|
+
test.describe('web assertions route through the injected expect()', () => {
|
|
13
|
+
test('toBeVisible passes when the injected matcher matches', async () => {
|
|
14
|
+
const { session } = sessionMatching({ matches: true });
|
|
15
|
+
await expect(webLocator(session)).toBeVisible();
|
|
16
|
+
});
|
|
17
|
+
test('toBeVisible rejects when the injected matcher does not match', async () => {
|
|
18
|
+
const { session } = sessionMatching({ matches: false, received: 'hidden' });
|
|
19
|
+
await playwrightExpect(expect(webLocator(session)).toBeVisible({ timeout: 200 })).rejects.toThrow();
|
|
20
|
+
});
|
|
21
|
+
test('not.toBeVisible passes when the matcher does not match', async () => {
|
|
22
|
+
const { session } = sessionMatching({ matches: false });
|
|
23
|
+
await expect(webLocator(session)).not.toBeVisible();
|
|
24
|
+
});
|
|
25
|
+
test('emits the exact Playwright expression for toHaveText', async () => {
|
|
26
|
+
const { session, evaluateCalls } = sessionMatching({ matches: true });
|
|
27
|
+
await expect(webLocator(session)).toHaveText('Hi');
|
|
28
|
+
playwrightExpect(evaluateCalls[0]).toContain('is.expect(elements[0],');
|
|
29
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expression":"to.have.text"');
|
|
30
|
+
playwrightExpect(evaluateCalls[0]).toContain('"string":"Hi"');
|
|
31
|
+
playwrightExpect(evaluateCalls[0]).toContain('"normalizeWhiteSpace":true');
|
|
32
|
+
});
|
|
33
|
+
test('toContainText uses to.have.text with matchSubstring', async () => {
|
|
34
|
+
const { session, evaluateCalls } = sessionMatching({ matches: true });
|
|
35
|
+
await expect(webLocator(session)).toContainText('dash');
|
|
36
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expression":"to.have.text"');
|
|
37
|
+
playwrightExpect(evaluateCalls[0]).toContain('"matchSubstring":true');
|
|
38
|
+
});
|
|
39
|
+
test('toHaveCount uses expectedNumber', async () => {
|
|
40
|
+
const { session, evaluateCalls } = sessionMatching({ matches: true });
|
|
41
|
+
await expect(webLocator(session)).toHaveCount(3);
|
|
42
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expression":"to.have.count"');
|
|
43
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expectedNumber":3');
|
|
44
|
+
});
|
|
45
|
+
test('toHaveAttribute carries the attribute name in expressionArg', async () => {
|
|
46
|
+
const { session, evaluateCalls } = sessionMatching({ matches: true });
|
|
47
|
+
await expect(webLocator(session)).toHaveAttribute('data-variant', 'primary');
|
|
48
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expression":"to.have.attribute.value"');
|
|
49
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expressionArg":"data-variant"');
|
|
50
|
+
playwrightExpect(evaluateCalls[0]).toContain('"string":"primary"');
|
|
51
|
+
});
|
|
52
|
+
test('toBeChecked passes expectedValue', async () => {
|
|
53
|
+
const { session, evaluateCalls } = sessionMatching({ matches: true });
|
|
54
|
+
await expect(webLocator(session)).toBeChecked();
|
|
55
|
+
playwrightExpect(evaluateCalls[0]).toContain('"expression":"to.be.checked"');
|
|
56
|
+
playwrightExpect(evaluateCalls[0]).toContain('"checked":true');
|
|
57
|
+
});
|
|
58
|
+
test('new matchers map to their injected expressions', async () => {
|
|
59
|
+
const { session, evaluateCalls } = sessionMatching({ matches: true });
|
|
60
|
+
const loc = webLocator(session);
|
|
61
|
+
await expect(loc).toHaveClass('active');
|
|
62
|
+
await expect(loc).toContainClass('act');
|
|
63
|
+
await expect(loc).toHaveCSS('color', 'red');
|
|
64
|
+
await expect(loc).toHaveId('main');
|
|
65
|
+
await expect(loc).toBeFocused();
|
|
66
|
+
await expect(loc).toBeEditable();
|
|
67
|
+
await expect(loc).toBeAttached();
|
|
68
|
+
await expect(loc).toBeInViewport();
|
|
69
|
+
await expect(loc).toHaveJSProperty('checked', true);
|
|
70
|
+
const joined = evaluateCalls.join('\n');
|
|
71
|
+
playwrightExpect(joined).toContain('"to.have.class"');
|
|
72
|
+
playwrightExpect(joined).toContain('"to.contain.class"');
|
|
73
|
+
playwrightExpect(joined).toContain('"to.have.css"');
|
|
74
|
+
playwrightExpect(joined).toContain('"expressionArg":"color"');
|
|
75
|
+
playwrightExpect(joined).toContain('"to.have.id"');
|
|
76
|
+
playwrightExpect(joined).toContain('"to.be.focused"');
|
|
77
|
+
playwrightExpect(joined).toContain('"to.be.editable"');
|
|
78
|
+
playwrightExpect(joined).toContain('"to.be.attached"');
|
|
79
|
+
playwrightExpect(joined).toContain('"to.be.in.viewport"');
|
|
80
|
+
playwrightExpect(joined).toContain('"to.have.property"');
|
|
81
|
+
playwrightExpect(joined).toContain('"expressionArg":"checked"');
|
|
82
|
+
});
|
|
83
|
+
test('assertions emit expect steps', async () => {
|
|
84
|
+
const titles = [];
|
|
85
|
+
const stepFn = (title, body) => { titles.push(title); return body(); };
|
|
86
|
+
const { session } = sessionMatching({ matches: true });
|
|
87
|
+
const loc = webLocator(session);
|
|
88
|
+
loc._stepFn = stepFn;
|
|
89
|
+
await expect(loc).toBeVisible();
|
|
90
|
+
playwrightExpect(titles).toContain('expect.toBeVisible()');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=web-expect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-expect.test.js","sourceRoot":"","sources":["../src/web-expect.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator-pwexpect.test.d.ts","sourceRoot":"","sources":["../src/web-locator-pwexpect.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { test, expect as pwExpect } from '@playwright/test';
|
|
2
|
+
import { WebLocator } from './web-locator.js';
|
|
3
|
+
import { fakeWebViewSession } from './fake-webview-session.js';
|
|
4
|
+
// Proof that Playwright's OWN expect() (from @playwright/test) can drive a
|
|
5
|
+
// mobilewright WebLocator: the web-first matchers call locator._expect() after
|
|
6
|
+
// gating on locator.constructor.name === 'Locator'. The fake session returns a
|
|
7
|
+
// canned injected-expect verdict, so these run without a device.
|
|
8
|
+
// A WebLocator whose injected expect() always reports the given match result.
|
|
9
|
+
function webLocatorWhoseMatchIs(matches) {
|
|
10
|
+
const { session } = fakeWebViewSession({ evaluateAlways: { matches } });
|
|
11
|
+
return new WebLocator(session, 'internal:role=button');
|
|
12
|
+
}
|
|
13
|
+
test('WebLocator is accepted by Playwright matchers (constructor.name === Locator)', () => {
|
|
14
|
+
const locator = webLocatorWhoseMatchIs(true);
|
|
15
|
+
pwExpect(locator.constructor.name).toBe('Locator');
|
|
16
|
+
});
|
|
17
|
+
test('expect(locator).toBeVisible() passes when the injected matcher matches', async () => {
|
|
18
|
+
const locator = webLocatorWhoseMatchIs(true);
|
|
19
|
+
await pwExpect(locator).toBeVisible({ timeout: 0 });
|
|
20
|
+
});
|
|
21
|
+
test('expect(locator).not.toBeVisible() passes when it does not match', async () => {
|
|
22
|
+
const locator = webLocatorWhoseMatchIs(false);
|
|
23
|
+
await pwExpect(locator).not.toBeVisible({ timeout: 0 });
|
|
24
|
+
});
|
|
25
|
+
test('expect(locator).toBeVisible() throws when the injected matcher does not match', async () => {
|
|
26
|
+
const locator = webLocatorWhoseMatchIs(false);
|
|
27
|
+
let threw = false;
|
|
28
|
+
try {
|
|
29
|
+
await pwExpect(locator).toBeVisible({ timeout: 0 });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
threw = true;
|
|
33
|
+
}
|
|
34
|
+
pwExpect(threw).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=web-locator-pwexpect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator-pwexpect.test.js","sourceRoot":"","sources":["../src/web-locator-pwexpect.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,2EAA2E;AAC3E,+EAA+E;AAC/E,+EAA+E;AAC/E,iEAAiE;AAEjE,8EAA8E;AAC9E,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,sBAAsB,CAAuB,CAAC;AAC/E,CAAC;AAED,IAAI,CAAC,8EAA8E,EAAE,GAAG,EAAE;IACxF,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAE,OAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACxF,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;IAC/F,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IACD,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator-reinjection.test.d.ts","sourceRoot":"","sources":["../src/web-locator-reinjection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { test, expect as playwrightExpect } from '@playwright/test';
|
|
2
|
+
import { WebLocator } from './web-locator.js';
|
|
3
|
+
// A bootstrap re-injection is the only evaluate that assigns window.__mwInjected.
|
|
4
|
+
function isEngineBootstrap(expr) {
|
|
5
|
+
return expr.includes('__mwInjected =');
|
|
6
|
+
}
|
|
7
|
+
// A session that fails the first engine-dependent evaluate with the exact error
|
|
8
|
+
// a dropped engine produces (as a page-initiated navigation would), then
|
|
9
|
+
// succeeds. Records every expression it was asked to evaluate.
|
|
10
|
+
function sessionThatLosesEngineOnce(finalResult) {
|
|
11
|
+
const calls = [];
|
|
12
|
+
let failedOnce = false;
|
|
13
|
+
const session = {
|
|
14
|
+
evaluate: async (expr) => {
|
|
15
|
+
calls.push(expr);
|
|
16
|
+
if (isEngineBootstrap(expr)) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
if (!failedOnce) {
|
|
20
|
+
failedOnce = true;
|
|
21
|
+
throw new Error('Cannot read properties of undefined (reading \'querySelectorAll\')');
|
|
22
|
+
}
|
|
23
|
+
return finalResult;
|
|
24
|
+
},
|
|
25
|
+
goto: async () => { },
|
|
26
|
+
goBack: async () => { },
|
|
27
|
+
goForward: async () => { },
|
|
28
|
+
url: async () => '',
|
|
29
|
+
title: async () => '',
|
|
30
|
+
reload: async () => { },
|
|
31
|
+
waitForLoadState: async () => { },
|
|
32
|
+
close: async () => { },
|
|
33
|
+
};
|
|
34
|
+
return { session, calls };
|
|
35
|
+
}
|
|
36
|
+
// A session whose evaluate always fails for a reason unrelated to the engine.
|
|
37
|
+
function sessionThatAlwaysFails(message) {
|
|
38
|
+
const calls = [];
|
|
39
|
+
const session = {
|
|
40
|
+
evaluate: async (expr) => {
|
|
41
|
+
calls.push(expr);
|
|
42
|
+
throw new Error(message);
|
|
43
|
+
},
|
|
44
|
+
goto: async () => { },
|
|
45
|
+
goBack: async () => { },
|
|
46
|
+
goForward: async () => { },
|
|
47
|
+
url: async () => '',
|
|
48
|
+
title: async () => '',
|
|
49
|
+
reload: async () => { },
|
|
50
|
+
waitForLoadState: async () => { },
|
|
51
|
+
close: async () => { },
|
|
52
|
+
};
|
|
53
|
+
return { session, calls };
|
|
54
|
+
}
|
|
55
|
+
test('re-injects the engine and retries when the page dropped window.__mwInjected', async () => {
|
|
56
|
+
const { session, calls } = sessionThatLosesEngineOnce(3);
|
|
57
|
+
const locator = new WebLocator(session, 'internal:role=link');
|
|
58
|
+
const count = await locator.count();
|
|
59
|
+
playwrightExpect(count).toBe(3);
|
|
60
|
+
// The engine was re-injected after the first call failed...
|
|
61
|
+
const reinjected = calls.filter(isEngineBootstrap).length;
|
|
62
|
+
playwrightExpect(reinjected).toBe(1);
|
|
63
|
+
// ...and the original count expression was retried (so it ran twice total).
|
|
64
|
+
// (Match the count expr exactly — the bootstrap script also mentions
|
|
65
|
+
// querySelectorAll internally.)
|
|
66
|
+
const countEvals = calls.filter((c) => c.startsWith('window.__mwInjected.querySelectorAll'));
|
|
67
|
+
playwrightExpect(countEvals.length).toBe(2);
|
|
68
|
+
});
|
|
69
|
+
test('does not re-inject when an evaluate fails for an unrelated reason', async () => {
|
|
70
|
+
const { session, calls } = sessionThatAlwaysFails('some unrelated boom');
|
|
71
|
+
const locator = new WebLocator(session, 'internal:role=link');
|
|
72
|
+
let threw = false;
|
|
73
|
+
try {
|
|
74
|
+
await locator.count();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
threw = true;
|
|
78
|
+
}
|
|
79
|
+
playwrightExpect(threw).toBe(true);
|
|
80
|
+
const reinjected = calls.filter(isEngineBootstrap).length;
|
|
81
|
+
playwrightExpect(reinjected).toBe(0);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=web-locator-reinjection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator-reinjection.test.js","sourceRoot":"","sources":["../src/web-locator-reinjection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,kFAAkF;AAClF,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC;AAOD,gFAAgF;AAChF,yEAAyE;AACzE,+DAA+D;AAC/D,SAAS,0BAA0B,CAAC,WAAoB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,OAAO,GAAmB;QAC9B,QAAQ,EAAE,KAAK,EAAK,IAAY,EAAc,EAAE;YAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,SAAc,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,WAAgB,CAAC;QAC1B,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACpB,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtB,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACzB,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACnB,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACrB,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtB,gBAAgB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAChC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAmB;QAC9B,QAAQ,EAAE,KAAK,EAAK,IAAY,EAAc,EAAE;YAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACpB,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtB,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACzB,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACnB,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACrB,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtB,gBAAgB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAChC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;IAC7F,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAEpC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,4DAA4D;IAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;IAC1D,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,4EAA4E;IAC5E,qEAAqE;IACrE,gCAAgC;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAC7F,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAE9D,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IAED,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;IAC1D,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { Locator } from '@playwright/test';
|
|
2
|
+
import type { Bounds, WebViewSession } from '@mobilewright/protocol';
|
|
3
|
+
import type { StepFn } from './locator.js';
|
|
4
|
+
import { type FrameExpectParams, type ExpectResult, type ExpectedTextValue } from './web-expect-matcher.js';
|
|
5
|
+
interface PlaywrightExpectOptions {
|
|
6
|
+
isNot?: boolean;
|
|
7
|
+
timeout?: number;
|
|
8
|
+
expectedText?: ExpectedTextValue[];
|
|
9
|
+
expectedNumber?: number;
|
|
10
|
+
expectedValue?: unknown;
|
|
11
|
+
expressionArg?: unknown;
|
|
12
|
+
}
|
|
13
|
+
interface PlaywrightExpectResult {
|
|
14
|
+
matches: boolean;
|
|
15
|
+
received?: unknown;
|
|
16
|
+
timedOut: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class MobileWebViewLocator {
|
|
19
|
+
protected readonly session: WebViewSession;
|
|
20
|
+
protected readonly selector: string;
|
|
21
|
+
_stepFn: StepFn | null;
|
|
22
|
+
constructor(session: WebViewSession, selector: string);
|
|
23
|
+
private derive;
|
|
24
|
+
private child;
|
|
25
|
+
private _step;
|
|
26
|
+
private firstEl;
|
|
27
|
+
private firstElExpr;
|
|
28
|
+
private evalEngine;
|
|
29
|
+
private evalOnFirst;
|
|
30
|
+
private actOnFirst;
|
|
31
|
+
private pollBoolean;
|
|
32
|
+
private readElementState;
|
|
33
|
+
private readFromFirst;
|
|
34
|
+
private readStringProp;
|
|
35
|
+
locator(selector: string): MobileWebViewLocator;
|
|
36
|
+
getByRole(role: string, opts?: {
|
|
37
|
+
name?: string | RegExp;
|
|
38
|
+
exact?: boolean;
|
|
39
|
+
}): MobileWebViewLocator;
|
|
40
|
+
getByText(text: string | RegExp, opts?: {
|
|
41
|
+
exact?: boolean;
|
|
42
|
+
}): MobileWebViewLocator;
|
|
43
|
+
getByLabel(label: string | RegExp, opts?: {
|
|
44
|
+
exact?: boolean;
|
|
45
|
+
}): MobileWebViewLocator;
|
|
46
|
+
getByPlaceholder(text: string | RegExp, opts?: {
|
|
47
|
+
exact?: boolean;
|
|
48
|
+
}): MobileWebViewLocator;
|
|
49
|
+
getByTestId(testId: string): MobileWebViewLocator;
|
|
50
|
+
getByAltText(text: string | RegExp): MobileWebViewLocator;
|
|
51
|
+
getByTitle(text: string | RegExp): MobileWebViewLocator;
|
|
52
|
+
first(): MobileWebViewLocator;
|
|
53
|
+
last(): MobileWebViewLocator;
|
|
54
|
+
nth(index: number): MobileWebViewLocator;
|
|
55
|
+
count(): Promise<number>;
|
|
56
|
+
getText(opts?: {
|
|
57
|
+
timeout?: number;
|
|
58
|
+
}): Promise<string>;
|
|
59
|
+
getValue(opts?: {
|
|
60
|
+
timeout?: number;
|
|
61
|
+
}): Promise<string>;
|
|
62
|
+
all(): Promise<MobileWebViewLocator[]>;
|
|
63
|
+
isVisible(opts?: {
|
|
64
|
+
timeout?: number;
|
|
65
|
+
}): Promise<boolean>;
|
|
66
|
+
isHidden(opts?: {
|
|
67
|
+
timeout?: number;
|
|
68
|
+
}): Promise<boolean>;
|
|
69
|
+
isEnabled(opts?: {
|
|
70
|
+
timeout?: number;
|
|
71
|
+
}): Promise<boolean>;
|
|
72
|
+
isDisabled(opts?: {
|
|
73
|
+
timeout?: number;
|
|
74
|
+
}): Promise<boolean>;
|
|
75
|
+
isChecked(opts?: {
|
|
76
|
+
timeout?: number;
|
|
77
|
+
}): Promise<boolean>;
|
|
78
|
+
textContent(opts?: {
|
|
79
|
+
timeout?: number;
|
|
80
|
+
}): Promise<string>;
|
|
81
|
+
innerText(opts?: {
|
|
82
|
+
timeout?: number;
|
|
83
|
+
}): Promise<string>;
|
|
84
|
+
innerHTML(opts?: {
|
|
85
|
+
timeout?: number;
|
|
86
|
+
}): Promise<string>;
|
|
87
|
+
inputValue(opts?: {
|
|
88
|
+
timeout?: number;
|
|
89
|
+
}): Promise<string>;
|
|
90
|
+
getAttribute(name: string, opts?: {
|
|
91
|
+
timeout?: number;
|
|
92
|
+
}): Promise<string | null>;
|
|
93
|
+
boundingBox(opts?: {
|
|
94
|
+
timeout?: number;
|
|
95
|
+
}): Promise<Bounds | null>;
|
|
96
|
+
waitFor(opts?: {
|
|
97
|
+
state?: 'visible' | 'hidden' | 'attached' | 'detached';
|
|
98
|
+
timeout?: number;
|
|
99
|
+
}): Promise<void>;
|
|
100
|
+
click(opts?: {
|
|
101
|
+
timeout?: number;
|
|
102
|
+
}): Promise<void>;
|
|
103
|
+
fill(text: string, opts?: {
|
|
104
|
+
timeout?: number;
|
|
105
|
+
}): Promise<void>;
|
|
106
|
+
type(text: string): Promise<void>;
|
|
107
|
+
press(key: string): Promise<void>;
|
|
108
|
+
focus(): Promise<void>;
|
|
109
|
+
hover(): Promise<void>;
|
|
110
|
+
scrollIntoViewIfNeeded(): Promise<void>;
|
|
111
|
+
private pollActionable;
|
|
112
|
+
private pollUntilVisible;
|
|
113
|
+
_runInjectedExpect(params: FrameExpectParams): Promise<ExpectResult>;
|
|
114
|
+
_expect(expression: string, options: PlaywrightExpectOptions): Promise<PlaywrightExpectResult>;
|
|
115
|
+
get expectTimeout(): number | undefined;
|
|
116
|
+
}
|
|
117
|
+
export interface MobileWebViewLocator extends Locator {
|
|
118
|
+
}
|
|
119
|
+
export { MobileWebViewLocator as WebLocator };
|
|
120
|
+
//# sourceMappingURL=web-locator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator.d.ts","sourceRoot":"","sources":["../src/web-locator.ts"],"names":[],"mappings":"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"}
|