@mobilewright/test 0.0.21 → 0.0.24

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/README.md ADDED
@@ -0,0 +1,419 @@
1
+ # Mobilewright
2
+
3
+ [![npm](https://img.shields.io/npm/dw/mobilewright?style=flat-square&label=npm%20downloads)](https://www.npmjs.com/package/mobilewright)
4
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue?style=flat-square)](LICENSE)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.4+-3178C6?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
6
+
7
+ Framework for mobile device automation, inspired by Playwright's architecture and developer experience.
8
+
9
+ **Mobilewright** targets iOS and Android devices, simulators, and emulators through a clean, auto-waiting API built on top of [mobilecli](https://github.com/mobile-next/mobilecli).
10
+
11
+ [Get Started](#quick-start) · [API Docs](#api-reference) · [Cloud (mobile-use.com)](https://mobile-use.com)
12
+
13
+ ## Why Mobilewright?
14
+
15
+ If you've used Playwright, you already know Mobilewright.
16
+
17
+ | | Mobilewright | Appium | Detox | XCTest/Espresso |
18
+ |---|---|---|---|---|
19
+ | API style | Playwright (`getByRole`, `expect`) | Selenium (WebDriver) | Custom | Native framework |
20
+ | Auto-wait | Built-in, every action | Manual waits | Partial | Manual |
21
+ | Setup | `npm install mobilewright` | Server + drivers + caps | React Native only | Xcode/AS only |
22
+ | Cross-platform | iOS + Android, one API | Yes, verbose | React Native only | Single platform |
23
+ | AI agent support | First-class (accessibility tree) | Limited | No | No |
24
+ | Real devices in the cloud | Via [mobile-use.com](https://mobile-use.com) | Yes (complex) | Simulators only | Yes |
25
+ | Locators | Semantic roles + labels | XPath, CSS, ID | Test IDs | Native queries |
26
+
27
+ ## Built for AI agents
28
+
29
+ Your agent needs a phone, not a screenshot.
30
+
31
+ Mobilewright exposes the device's accessibility tree — deterministic, token-efficient, no vision model needed. Use it with [mobile-mcp](https://github.com/mobile-next/mobile-mcp), Claude, Cursor, or any coding agent.
32
+
33
+ ```typescript
34
+ // An AI agent can control a real phone with readable, semantic actions
35
+ await screen.getByRole('button', { name: 'Sign In' }).tap();
36
+ await screen.getByLabel('Email').fill('user@example.com');
37
+ await expect(screen.getByText('Welcome')).toBeVisible();
38
+ ```
39
+
40
+ No XPath. No coordinates. No vision model. The agent reads the accessibility tree and acts on it directly.
41
+
42
+ ## Features
43
+
44
+ - **Playwright-style API** — `screen.getByRole('button').tap()`, just like `page.getByRole('button').click()`
45
+ - **Zero config** — auto-discovers booted simulators
46
+ - **Cross-platform** — unified interface for iOS and Android
47
+ - **Auto-waiting** — actions wait for elements to be visible, enabled, and stable before interacting
48
+ - **Chainable locators** — `screen.getByType('Cell').getByLabel('Item 1')`
49
+ - **Retry assertions** — `expect(locator).toBeVisible()` polls until satisfied or timeout
50
+ - **Remote support** — connect to mobilecli on another machine for device lab setups
51
+ - **Test fixtures** — `@mobilewright/test` extends Playwright Test with `screen` and `device` fixtures
52
+
53
+ ## Quick Start
54
+
55
+ ```bash
56
+ npm install mobilewright
57
+ ```
58
+
59
+ ```typescript
60
+ import { ios, expect } from 'mobilewright';
61
+
62
+ const device = await ios.launch({ bundleId: 'com.example.myapp' });
63
+ const { screen } = device;
64
+
65
+ await screen.getByLabel('Email').fill('user@example.com');
66
+ await screen.getByLabel('Password').fill('password123');
67
+ await screen.getByRole('button', { name: 'Sign In' }).tap();
68
+
69
+ await expect(screen.getByText('Welcome back')).toBeVisible();
70
+ const screenshot = await screen.screenshot();
71
+
72
+ await device.close();
73
+ ```
74
+
75
+ ## Prerequisites
76
+
77
+ - Node.js >= 18
78
+ - A booted iOS simulator, Android emulator, or connected real device
79
+
80
+ Run `mobilewright doctor` to verify your environment is ready:
81
+
82
+ ```bash
83
+ npx mobilewright doctor
84
+ ```
85
+
86
+ It checks Xcode, Android SDK, simulators, ADB, and other dependencies — and tells you exactly what's missing and how to fix it. Add `--json` for machine-readable output.
87
+
88
+ ## Packages
89
+
90
+ | Package | Description |
91
+ |---|---|
92
+ | `mobilewright` | Main entry point — `ios`, `android` launchers, `expect`, config, CLI |
93
+ | `@mobilewright/test` | Test fixtures |
94
+ | `@mobilewright/protocol` | TypeScript interfaces (`MobilewrightDriver`, `ViewNode`) |
95
+ | `@mobilewright/driver-mobilecli` | WebSocket JSON-RPC client for mobilecli |
96
+ | `@mobilewright/driver-mobile-use` | WebSocket JSON-RPC client for [mobile-use.com](https://mobile-use.com) cloud devices |
97
+ | `@mobilewright/mobilewright-core` | `Device`, `Screen`, `Locator`, `expect` — the user-facing API |
98
+
99
+ Most users only need `mobilewright` (or `@mobilewright/test` for vitest integration).
100
+
101
+ ## API Reference
102
+
103
+ ### Launchers — `ios` and `android`
104
+
105
+ The top-level entry points. Like Playwright's `chromium` / `firefox` / `webkit`.
106
+
107
+ ```typescript
108
+ import { ios, android } from 'mobilewright';
109
+
110
+ // Launch with auto-discovery (finds first booted simulator)
111
+ const device = await ios.launch();
112
+
113
+ // Launch a specific app
114
+ const device = await ios.launch({ bundleId: 'com.example.app' });
115
+
116
+ // Target a specific simulator by name
117
+ const device = await ios.launch({ deviceName: /My.*iPhone/ });
118
+
119
+ // Explicit device UDID (skips discovery)
120
+ const device = await ios.launch({ deviceId: '5A5FCFCA-...' });
121
+
122
+ // List available devices
123
+ const devices = ios.devices();
124
+ const devices = android.devices();
125
+ ```
126
+
127
+ `launch()` handles the full lifecycle:
128
+ 1. Checks if mobilecli is reachable (auto-starts it for local URLs if not running)
129
+ 2. Discovers booted devices (prefers simulators over real devices)
130
+ 3. Connects and optionally launches the app
131
+ 4. On `device.close()`, kills the auto-started server
132
+
133
+ ### Screen
134
+
135
+ Entry point for finding and interacting with elements. Access via `device.screen`.
136
+
137
+ **Locator factories:**
138
+
139
+ ```typescript
140
+ screen.getByLabel('Email') // accessibility label
141
+ screen.getByTestId('login-button') // accessibility identifier
142
+ screen.getByText('Welcome') // visible text (exact match)
143
+ screen.getByText(/welcome/i) // RegExp match
144
+ screen.getByText('welcome', { exact: false }) // substring match
145
+ screen.getByType('TextField') // element type
146
+ screen.getByRole('button', { name: 'Sign In' }) // semantic role + name filter
147
+ ```
148
+
149
+ **Direct actions:**
150
+
151
+ ```typescript
152
+ await screen.screenshot() // capture PNG
153
+ await screen.screenshot({ format: 'jpeg', quality: 80 })
154
+ await screen.swipe('up')
155
+ await screen.swipe('down', { distance: 300, duration: 500 })
156
+ await screen.pressButton('HOME')
157
+ await screen.tap(195, 400) // raw coordinate tap
158
+ ```
159
+
160
+ ### Locator
161
+
162
+ Lazy, chainable element reference. No queries execute until you call an action or assertion.
163
+
164
+ **Actions** (all auto-wait for the element to be visible, enabled, and have stable bounds):
165
+
166
+ ```typescript
167
+ await locator.tap()
168
+ await locator.doubleTap()
169
+ await locator.longPress({ duration: 1000 })
170
+ await locator.fill('hello@example.com') // tap to focus + type text
171
+ ```
172
+
173
+ **Queries:**
174
+
175
+ ```typescript
176
+ await locator.isVisible() // boolean
177
+ await locator.isEnabled() // boolean
178
+ await locator.isSelected() // boolean
179
+ await locator.isFocused() // boolean
180
+ await locator.isChecked() // boolean
181
+ await locator.getText() // waits for visibility first
182
+ await locator.getValue() // raw value (e.g. text field content)
183
+ ```
184
+
185
+ **Explicit waiting:**
186
+
187
+ ```typescript
188
+ await locator.waitFor({ state: 'visible' })
189
+ await locator.waitFor({ state: 'hidden' })
190
+ await locator.waitFor({ state: 'enabled' })
191
+ await locator.waitFor({ state: 'disabled', timeout: 10_000 })
192
+ ```
193
+
194
+ **Chaining** — scope queries within a parent element's bounds:
195
+
196
+ ```typescript
197
+ // Tap the delete button inside the first row
198
+ const row = screen.getByType('Cell');
199
+ await row.getByRole('button', { name: 'Delete' }).tap();
200
+
201
+ // Get text from a navigation bar
202
+ const title = await screen.getByType('NavigationBar').getByType('StaticText').getText();
203
+ ```
204
+
205
+ When chaining, child lookups use bounds-based containment: any element whose bounds fit within the parent's bounds is considered a child. This works correctly with mobilecli's flat element lists.
206
+
207
+ ### Device
208
+
209
+ Manages the connection lifecycle and exposes device/app-level controls.
210
+
211
+ ```typescript
212
+ // Orientation
213
+ await device.setOrientation('landscape');
214
+ const orientation = await device.getOrientation();
215
+
216
+ // URLs / deep links (goto is a Playwright-style alias for openUrl)
217
+ await device.goto('myapp://settings');
218
+ await device.openUrl('https://example.com');
219
+
220
+ // App lifecycle
221
+ await device.launchApp('com.example.app', { locale: 'fr_FR' });
222
+ await device.terminateApp('com.example.app');
223
+ const apps = await device.listApps();
224
+ const foreground = await device.getForegroundApp();
225
+ await device.installApp('/path/to/app.ipa');
226
+ await device.uninstallApp('com.example.app');
227
+
228
+ // Cleanup (disconnects + stops auto-started mobilecli)
229
+ await device.close();
230
+ ```
231
+
232
+ ### Assertions — `expect`
233
+
234
+ All assertions poll repeatedly until satisfied or timeout (default 5s). Supports `.not` for negation.
235
+
236
+ ```typescript
237
+ import { expect } from 'mobilewright';
238
+
239
+ await expect(locator).toBeVisible();
240
+ await expect(locator).not.toBeVisible();
241
+
242
+ await expect(locator).toBeEnabled();
243
+ await expect(locator).not.toBeEnabled();
244
+
245
+ await expect(locator).toHaveText('Welcome back!');
246
+ await expect(locator).toHaveText(/welcome/i);
247
+ await expect(locator).toContainText('back');
248
+
249
+ await expect(locator).toBeVisible({ timeout: 10_000 });
250
+ ```
251
+
252
+ ### Role Mapping
253
+
254
+ `getByRole` maps semantic roles to platform-specific element types:
255
+
256
+ | Role | iOS | Android |
257
+ |---|---|---|
258
+ | `button` | Button, ImageButton | Button, ImageButton, ReactViewGroup* |
259
+ | `textfield` | TextField, SecureTextField, SearchField | EditText, ReactEditText |
260
+ | `text` | StaticText | TextView, Text, ReactTextView |
261
+ | `image` | Image | ImageView, ReactImageView |
262
+ | `switch` | Switch | Switch, Toggle |
263
+ | `checkbox` | -- | Checkbox |
264
+ | `slider` | Slider | SeekBar |
265
+ | `list` | Table, CollectionView, ScrollView | ListView, RecyclerView, ReactScrollView |
266
+ | `header` | NavigationBar | Toolbar, Header |
267
+ | `link` | Link | Link |
268
+ | `listitem` | Cell | LinearLayout, RelativeLayout, Other |
269
+ | `tab` | Tab, TabBar | Tab, TabBar |
270
+
271
+ \* ReactViewGroup matches `button` only when the element has `clickable="true"` or `accessible="true"` in its raw attributes, to avoid false positives since React Native uses ReactViewGroup for all container views.
272
+
273
+ Falls back to direct type matching if no mapping exists.
274
+
275
+ ## Configuration
276
+
277
+ Create a `mobilewright.config.ts` in your project root:
278
+
279
+ ```typescript
280
+ import { defineConfig } from 'mobilewright';
281
+
282
+ export default defineConfig({
283
+ platform: 'ios',
284
+ bundleId: 'com.example.myapp',
285
+ deviceName: 'iPhone 16',
286
+ timeout: 10_000,
287
+ });
288
+ ```
289
+
290
+ All options:
291
+
292
+ | Option | Type | Description |
293
+ |---|---|---|
294
+ | `platform` | `'ios' \| 'android'` | Device platform (optional) |
295
+ | `bundleId` | `string` | App bundle ID (optional) |
296
+ | `deviceId` | `string` | Explicit device UDID (optional) |
297
+ | `deviceName` | `RegExp` | RegExp to match device name (optional) |
298
+ | `timeout` | `number` | Global locator timeout in ms (optional) |
299
+ | `testDir` | `string` | Directory to search for test files (optional) |
300
+ | `testMatch` | `string \| RegExp \| Array` | Glob patterns for test files (optional) |
301
+ | `reporter` | `'list' \| 'html' \| 'json' \| 'junit' \| Array` | Reporter to use (optional) |
302
+ | `retries` | `number` | Maximum retry count for flaky tests (optional) |
303
+ | `projects` | `MobilewrightProjectConfig[]` | Multi-device / multi-platform project matrix (optional) |
304
+
305
+ Config values are used as defaults — `LaunchOptions` passed to `ios.launch()` always take precedence.
306
+
307
+ Mobilewright will use the first device that matches your configured criteria.
308
+
309
+ ## Test Fixtures
310
+
311
+ `@mobilewright/test` extends [Playwright Test](https://playwright.dev/docs/test-intro) with mobile-specific fixtures:
312
+
313
+ ```typescript
314
+ import { test, expect } from '@mobilewright/test';
315
+
316
+ // Configure the app bundle and video recording for all tests in this file
317
+ test.use({ bundleId: 'com.example.myapp', video: 'on' });
318
+
319
+ test('can sign in', async ({ device, screen, bundleId }) => {
320
+ // Fresh-launch the app before the test
321
+ await device.terminateApp(bundleId).catch(() => {});
322
+ await device.launchApp(bundleId);
323
+
324
+ await screen.getByLabel('Email').fill('user@example.com');
325
+ await screen.getByLabel('Password').fill('password123');
326
+ await screen.getByRole('button', { name: 'Sign In' }).tap();
327
+
328
+ await expect(screen.getByText('Welcome back')).toBeVisible();
329
+ });
330
+ ```
331
+
332
+ The `device` fixture connects once per worker (reading from `mobilewright.config.ts`) and calls `device.close()` after all tests complete. The `screen` fixture provides `device.screen` to each test, with automatic screenshot-on-failure and optional video recording.
333
+
334
+ ## CLI
335
+
336
+ ### `mobilewright init`
337
+
338
+ Scaffold a `mobilewright.config.ts` and `example.test.ts` in the current directory. Skips files that already exist.
339
+
340
+ ```bash
341
+ npx mobilewright init
342
+ ```
343
+
344
+ ```
345
+ created mobilewright.config.ts
346
+ created example.test.ts
347
+ ```
348
+
349
+ ### `mobilewright devices`
350
+
351
+ List all connected devices, simulators, and emulators.
352
+
353
+ ```bash
354
+ npx mobilewright devices
355
+ ```
356
+
357
+ ```
358
+ ID Name Platform Type State
359
+ -------------------------------------------------------------------------------------------------
360
+ 00008110-0011281A112A801E VPhone ios real-device booted
361
+ 5A5FCFCA-27EC-4D1B-B412-BAE629154EE0 iPhone 17 Pro ios simulator booted
362
+ ```
363
+
364
+ ### `mobilewright test`
365
+
366
+ Run your tests. Auto-discovers `mobilewright.config.ts` in the current directory.
367
+
368
+ ```bash
369
+ npx mobilewright test
370
+ npx mobilewright test login.test.ts # run a specific file
371
+ npx mobilewright test --grep "sign in" # filter by test name
372
+ npx mobilewright test --reporter html # generate HTML report
373
+ npx mobilewright test --retries 2 # retry flaky tests
374
+ npx mobilewright test --workers 4 # parallel workers
375
+ npx mobilewright test --list # list tests without running
376
+ ```
377
+
378
+ ### `mobilewright show-report`
379
+
380
+ Open the HTML report generated by `--reporter html`.
381
+
382
+ ```bash
383
+ npx mobilewright show-report
384
+ npx mobilewright show-report mobilewright-report/
385
+ ```
386
+
387
+ ## Run on real devices with mobile-use.com
388
+
389
+ Need real phones in the cloud? [mobile-use.com](https://mobile-use.com) gives you API access to hundreds of real Android and iOS devices. Your Mobilewright scripts run with zero modification — point your config at the mobile-use.com endpoint and go.
390
+
391
+ mobile-use.com is the only device cloud with native Mobilewright support.
392
+
393
+ ## Contributing
394
+
395
+ ```bash
396
+ # Run the repository's own unit tests
397
+ npm test
398
+ ```
399
+
400
+ ## Framework Support
401
+
402
+ | Framework | iOS | Android | Notes |
403
+ |---|---|---|---|
404
+ | UIKit / Storyboards | ✅ | — | Full native element types, all locators work |
405
+ | SwiftUI | ✅ | — | Maps to standard `XCUIElementType` accessibility tree |
406
+ | Jetpack Compose | — | ✅ | Renders to native Android accessibility nodes |
407
+ | Android Views (XML layouts) | — | ✅ | Full native element types, all locators work |
408
+ | React Native | ✅ | ✅ | Uses real native components; RN-specific types mapped to roles |
409
+ | Expo | ✅ | ✅ | Same as React Native (Expo builds to RN) |
410
+ | Flutter | ⏳ | ⏳ | Renders via Skia/Impeller, not native views — requires Dart VM Service driver |
411
+ | .NET MAUI | ✅ | ✅ | Compiles to native controls on both platforms |
412
+ | Kotlin Multiplatform (shared UI) | ⏳ | ✅ | Android native works; iOS Compose Multiplatform support in progress |
413
+ | Cordova / Capacitor | ✅ | ✅ | WebView content accessible via native accessibility tree |
414
+ | NativeScript | ✅ | ✅ | Renders to native views on both platforms |
415
+
416
+ ## License
417
+
418
+ This project is licensed under the Apache License 2.0 — see the [LICENSE](LICENSE) file for details.
419
+
@@ -6,7 +6,6 @@ type MobilewrightTestFixtures = {
6
6
  };
7
7
  type MobilewrightWorkerFixtures = {
8
8
  platform: 'ios' | 'android' | undefined;
9
- deviceId: string | undefined;
10
9
  deviceName: RegExp | undefined;
11
10
  device: Device;
12
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEzD,KAAK,wBAAwB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,IAAI,gSAqEf,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEzD,KAAK,wBAAwB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,IAAI,gSAsEf,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/fixtures.js CHANGED
@@ -4,16 +4,17 @@ import { join } from 'node:path';
4
4
  import { ios, android, loadConfig } from 'mobilewright';
5
5
  import { expect } from '@mobilewright/core';
6
6
  export const test = base.extend({
7
- bundleId: [undefined, { option: true }],
7
+ bundleId: [async ({}, use) => {
8
+ const config = await loadConfig();
9
+ await use(config.bundleId);
10
+ }, { option: true }],
8
11
  platform: [undefined, { option: true, scope: 'worker' }],
9
- deviceId: [undefined, { option: true, scope: 'worker' }],
10
12
  deviceName: [undefined, { option: true, scope: 'worker' }],
11
- device: [async ({ platform, deviceId, deviceName }, use) => {
13
+ device: [async ({ platform, deviceName }, use) => {
12
14
  const config = await loadConfig();
13
15
  const merged = {
14
16
  ...config,
15
17
  ...(platform && { platform }),
16
- ...(deviceId && { deviceId }),
17
18
  ...(deviceName && { deviceName }),
18
19
  };
19
20
  if (merged.platform && merged.platform !== 'ios' && merged.platform !== 'android') {
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAc5C,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAuD;IACpF,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACxD,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAE1D,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG;gBACb,GAAG,MAAM;gBACT,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC7B,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;aAClC,CAAC;YAEF,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClF,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,QAAQ,gCAAgC,CAAC,CAAC;YAC7F,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;YAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAEvB,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACjD,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACjE,MAAM,YAAY,GAAG,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,mBAAmB,CAAC;QAC7E,MAAM,SAAS,GAAG,YAAY;YAC5B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,MAAM,MAAM,CAAC;YAC1D,CAAC,CAAC,EAAE,CAAC;QAEP,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;QACH,CAAC;QAED,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEzB,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,cAAc,CAAC;gBAC3D,MAAM,YAAY,GAAG,SAAS,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,mBAAmB,IAAI,MAAM,CAAC,CAAC;gBAEzF,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAC9C,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;gBAClF,CAAC;gBAED,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpD,MAAM,QAAQ,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;YACjG,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mobilewright/test",
3
- "version": "0.0.21",
3
+ "version": "0.0.24",
4
4
  "description": "Test fixtures for Mobilewright",
5
5
  "homepage": "https://mobilewright.dev",
6
6
  "license": "Apache-2.0",
@@ -22,15 +22,15 @@
22
22
  },
23
23
  "repository": {
24
24
  "type": "git",
25
- "url": "https://github.com/mobile-next/mobilewright",
25
+ "url": "git+https://github.com/mobile-next/mobilewright.git",
26
26
  "directory": "packages/test"
27
27
  },
28
28
  "files": [
29
29
  "dist"
30
30
  ],
31
31
  "dependencies": {
32
- "@mobilewright/core": "^0.0.21",
33
- "@mobilewright/protocol": "^0.0.21",
32
+ "@mobilewright/core": "^0.0.24",
33
+ "@mobilewright/protocol": "^0.0.24",
34
34
  "@playwright/test": "1.58.2"
35
35
  }
36
36
  }