craftdriver 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/LICENSE +21 -0
- package/README.md +37 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/actions.d.ts +50 -0
- package/dist/lib/actions.d.ts.map +1 -0
- package/dist/lib/actions.js +71 -0
- package/dist/lib/actions.js.map +1 -0
- package/dist/lib/browser.d.ts +94 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +133 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/builder.d.ts +13 -0
- package/dist/lib/builder.d.ts.map +1 -0
- package/dist/lib/builder.js +31 -0
- package/dist/lib/builder.js.map +1 -0
- package/dist/lib/by.d.ts +45 -0
- package/dist/lib/by.d.ts.map +1 -0
- package/dist/lib/by.js +132 -0
- package/dist/lib/by.js.map +1 -0
- package/dist/lib/chrome.d.ts +6 -0
- package/dist/lib/chrome.d.ts.map +1 -0
- package/dist/lib/chrome.js +27 -0
- package/dist/lib/chrome.js.map +1 -0
- package/dist/lib/driver.d.ts +35 -0
- package/dist/lib/driver.d.ts.map +1 -0
- package/dist/lib/driver.js +347 -0
- package/dist/lib/driver.js.map +1 -0
- package/dist/lib/elementHandle.d.ts +17 -0
- package/dist/lib/elementHandle.d.ts.map +1 -0
- package/dist/lib/elementHandle.js +46 -0
- package/dist/lib/elementHandle.js.map +1 -0
- package/dist/lib/expect.d.ts +17 -0
- package/dist/lib/expect.d.ts.map +1 -0
- package/dist/lib/expect.js +56 -0
- package/dist/lib/expect.js.map +1 -0
- package/dist/lib/http.d.ts +7 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +47 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/keyboard.d.ts +14 -0
- package/dist/lib/keyboard.d.ts.map +1 -0
- package/dist/lib/keyboard.js +31 -0
- package/dist/lib/keyboard.js.map +1 -0
- package/dist/lib/keys.d.ts +43 -0
- package/dist/lib/keys.d.ts.map +1 -0
- package/dist/lib/keys.js +146 -0
- package/dist/lib/keys.js.map +1 -0
- package/dist/lib/locator.d.ts +20 -0
- package/dist/lib/locator.d.ts.map +1 -0
- package/dist/lib/locator.js +57 -0
- package/dist/lib/locator.js.map +1 -0
- package/dist/lib/mouse.d.ts +34 -0
- package/dist/lib/mouse.d.ts.map +1 -0
- package/dist/lib/mouse.js +108 -0
- package/dist/lib/mouse.js.map +1 -0
- package/dist/lib/service.d.ts +26 -0
- package/dist/lib/service.d.ts.map +1 -0
- package/dist/lib/service.js +86 -0
- package/dist/lib/service.js.map +1 -0
- package/dist/lib/types.d.ts +23 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/wait.d.ts +25 -0
- package/dist/lib/wait.d.ts.map +1 -0
- package/dist/lib/wait.js +92 -0
- package/dist/lib/wait.js.map +1 -0
- package/dist/lib/webelement.d.ts +20 -0
- package/dist/lib/webelement.d.ts.map +1 -0
- package/dist/lib/webelement.js +64 -0
- package/dist/lib/webelement.js.map +1 -0
- package/package.json +69 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) YEAR FULL NAME
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Craftdriver 🍺🍺🍺
|
|
2
|
+
|
|
3
|
+
Crafted Node.js browser automation built directly on the WebDriver protocol.
|
|
4
|
+
|
|
5
|
+
Think of it as a modern take on Selenium with automatic waits and ergonomic API, while staying true to the W3C standards so your tests stay stable across real browsers.
|
|
6
|
+
|
|
7
|
+
## Getting started
|
|
8
|
+
|
|
9
|
+
Install from npm (package coming soon):
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install craftdriver
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Quick example:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { Browser } from 'craftdriver';
|
|
19
|
+
|
|
20
|
+
const browser = await Browser.launch({ browserName: 'chrome' });
|
|
21
|
+
await browser.navigateTo('http://127.0.0.1:8080/login.html');
|
|
22
|
+
await browser.type('#username', 'testuser');
|
|
23
|
+
await browser.type('#password', 'secret');
|
|
24
|
+
await browser.click('#submit');
|
|
25
|
+
await browser.expect('#result').toHaveText('Welcome testuser');
|
|
26
|
+
await browser.quit();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
See [DOCUMENTATION.md](DOCUMENTATION.md) for more details.
|
|
30
|
+
|
|
31
|
+
## Contributing
|
|
32
|
+
|
|
33
|
+
PRs and issues are welcome. Be kind. Brew great tests.
|
|
34
|
+
|
|
35
|
+
## License
|
|
36
|
+
|
|
37
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAsB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Driver } from './driver.js';
|
|
2
|
+
import type { WebElement } from './webelement.js';
|
|
3
|
+
export type KeyStep = {
|
|
4
|
+
type: 'keyDown' | 'keyUp';
|
|
5
|
+
value: string;
|
|
6
|
+
};
|
|
7
|
+
export type PointerStep = {
|
|
8
|
+
type: 'pointerMove';
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
duration?: number;
|
|
12
|
+
origin?: 'viewport' | WebElement;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'pointerDown' | 'pointerUp';
|
|
15
|
+
button?: number;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'pause';
|
|
18
|
+
duration?: number;
|
|
19
|
+
};
|
|
20
|
+
export type WheelStep = {
|
|
21
|
+
type: 'scroll';
|
|
22
|
+
x?: number;
|
|
23
|
+
y?: number;
|
|
24
|
+
deltaX: number;
|
|
25
|
+
deltaY: number;
|
|
26
|
+
duration?: number;
|
|
27
|
+
};
|
|
28
|
+
export declare class ActionsBuilder {
|
|
29
|
+
private driver;
|
|
30
|
+
private keyActions;
|
|
31
|
+
private pointerActions;
|
|
32
|
+
private wheelActions;
|
|
33
|
+
constructor(driver: Driver);
|
|
34
|
+
keyDown(value: string): this;
|
|
35
|
+
keyUp(value: string): this;
|
|
36
|
+
pointerMove(x: number, y: number, options?: {
|
|
37
|
+
duration?: number;
|
|
38
|
+
origin?: 'viewport' | WebElement;
|
|
39
|
+
}): this;
|
|
40
|
+
pointerDown(button?: number): this;
|
|
41
|
+
pointerUp(button?: number): this;
|
|
42
|
+
pause(duration?: number): this;
|
|
43
|
+
wheel(deltaX: number, deltaY: number, options?: {
|
|
44
|
+
x?: number;
|
|
45
|
+
y?: number;
|
|
46
|
+
duration?: number;
|
|
47
|
+
}): this;
|
|
48
|
+
perform(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/lib/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAClC,GACD;IAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACzC,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,cAAc;IAKb,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,YAAY,CAAmB;gBAEnB,MAAM,EAAE,MAAM;IAElC,OAAO,CAAC,KAAK,EAAE,MAAM;IAIrB,KAAK,CAAC,KAAK,EAAE,MAAM;IAKnB,WAAW,CACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,CAAA;KAAE;IAWnE,WAAW,CAAC,MAAM,GAAE,MAAU;IAI9B,SAAS,CAAC,MAAM,GAAE,MAAU;IAI5B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM;IAKvB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAYvF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB/B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export class ActionsBuilder {
|
|
2
|
+
driver;
|
|
3
|
+
keyActions = [];
|
|
4
|
+
pointerActions = [];
|
|
5
|
+
wheelActions = [];
|
|
6
|
+
constructor(driver) {
|
|
7
|
+
this.driver = driver;
|
|
8
|
+
}
|
|
9
|
+
keyDown(value) {
|
|
10
|
+
this.keyActions.push({ type: 'keyDown', value });
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
keyUp(value) {
|
|
14
|
+
this.keyActions.push({ type: 'keyUp', value });
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
pointerMove(x, y, options) {
|
|
18
|
+
this.pointerActions.push({
|
|
19
|
+
type: 'pointerMove',
|
|
20
|
+
x,
|
|
21
|
+
y,
|
|
22
|
+
duration: options?.duration,
|
|
23
|
+
origin: options?.origin,
|
|
24
|
+
});
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
pointerDown(button = 0) {
|
|
28
|
+
this.pointerActions.push({ type: 'pointerDown', button });
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
pointerUp(button = 0) {
|
|
32
|
+
this.pointerActions.push({ type: 'pointerUp', button });
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
pause(duration) {
|
|
36
|
+
this.pointerActions.push({ type: 'pause', duration });
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
wheel(deltaX, deltaY, options) {
|
|
40
|
+
this.wheelActions.push({
|
|
41
|
+
type: 'scroll',
|
|
42
|
+
x: options?.x,
|
|
43
|
+
y: options?.y,
|
|
44
|
+
deltaX,
|
|
45
|
+
deltaY,
|
|
46
|
+
duration: options?.duration,
|
|
47
|
+
});
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
async perform() {
|
|
51
|
+
const actions = [];
|
|
52
|
+
if (this.keyActions.length)
|
|
53
|
+
actions.push({ type: 'key', id: 'keyboard', actions: this.keyActions });
|
|
54
|
+
if (this.pointerActions.length)
|
|
55
|
+
actions.push({
|
|
56
|
+
type: 'pointer',
|
|
57
|
+
id: 'mouse',
|
|
58
|
+
parameters: { pointerType: 'mouse' },
|
|
59
|
+
actions: this.pointerActions,
|
|
60
|
+
});
|
|
61
|
+
if (this.wheelActions.length)
|
|
62
|
+
actions.push({ type: 'wheel', id: 'wheel', actions: this.wheelActions });
|
|
63
|
+
if (!actions.length)
|
|
64
|
+
return;
|
|
65
|
+
const send = this.driver.__sendActions;
|
|
66
|
+
if (!send)
|
|
67
|
+
throw new Error('Driver does not support combined actions');
|
|
68
|
+
await send(actions);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/lib/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ChromeService } from './chrome.js';
|
|
2
|
+
import { Driver } from './driver.js';
|
|
3
|
+
import { By } from './by.js';
|
|
4
|
+
import { Condition, WaitOptions } from './wait.js';
|
|
5
|
+
import { ElementHandle } from './elementHandle.js';
|
|
6
|
+
import { KeyboardController } from './keyboard.js';
|
|
7
|
+
import { MouseController } from './mouse.js';
|
|
8
|
+
import { ActionsBuilder } from './actions.js';
|
|
9
|
+
export interface LaunchOptions {
|
|
10
|
+
browserName?: 'chrome' | 'chromium' | 'firefox' | 'edge' | 'safari';
|
|
11
|
+
chromeService?: ChromeService;
|
|
12
|
+
}
|
|
13
|
+
export declare class Browser {
|
|
14
|
+
private driver;
|
|
15
|
+
private constructor();
|
|
16
|
+
static launch(options?: LaunchOptions): Promise<Browser>;
|
|
17
|
+
navigateTo(url: string): Promise<void>;
|
|
18
|
+
url(): Promise<string>;
|
|
19
|
+
title(): Promise<string>;
|
|
20
|
+
wait<T>(condition: Condition<T>, options?: WaitOptions & {
|
|
21
|
+
message?: string;
|
|
22
|
+
}): Promise<T>;
|
|
23
|
+
wait<T>(condition: Condition<T>, timeoutMs?: number, intervalMs?: number, message?: string): Promise<T>;
|
|
24
|
+
quit(): Promise<void>;
|
|
25
|
+
click(selector: string | By): Promise<void>;
|
|
26
|
+
type(selector: string | By, text: string, opts?: {
|
|
27
|
+
mask?: boolean;
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
gesture: {
|
|
31
|
+
swipe: ({ from, to, durationMs, }: {
|
|
32
|
+
from: [number, number];
|
|
33
|
+
to: [number, number];
|
|
34
|
+
durationMs?: number;
|
|
35
|
+
}) => Promise<void>;
|
|
36
|
+
pinch: ({ center, scale, distance, durationMs, }: {
|
|
37
|
+
center: [number, number];
|
|
38
|
+
scale?: number;
|
|
39
|
+
distance?: number;
|
|
40
|
+
durationMs?: number;
|
|
41
|
+
}) => Promise<void>;
|
|
42
|
+
};
|
|
43
|
+
screenshot(selectorOrBy?: string | By): Promise<Buffer>;
|
|
44
|
+
saveScreenshot(path: string, selectorOrBy?: string | By): Promise<Buffer>;
|
|
45
|
+
expect(selector: string | By): import("./expect.js").ExpectApi;
|
|
46
|
+
find(selector: string | By): ElementHandle;
|
|
47
|
+
keyboard: KeyboardController;
|
|
48
|
+
mouse: MouseController;
|
|
49
|
+
static Key: {
|
|
50
|
+
readonly Null: string;
|
|
51
|
+
readonly Cancel: string;
|
|
52
|
+
readonly Help: string;
|
|
53
|
+
readonly Backspace: string;
|
|
54
|
+
readonly Tab: string;
|
|
55
|
+
readonly Clear: string;
|
|
56
|
+
readonly Return: string;
|
|
57
|
+
readonly Enter: string;
|
|
58
|
+
readonly Shift: string;
|
|
59
|
+
readonly Control: string;
|
|
60
|
+
readonly Alt: string;
|
|
61
|
+
readonly Pause: string;
|
|
62
|
+
readonly Escape: string;
|
|
63
|
+
readonly Space: string;
|
|
64
|
+
readonly PageUp: string;
|
|
65
|
+
readonly PageDown: string;
|
|
66
|
+
readonly End: string;
|
|
67
|
+
readonly Home: string;
|
|
68
|
+
readonly ArrowLeft: string;
|
|
69
|
+
readonly ArrowUp: string;
|
|
70
|
+
readonly ArrowRight: string;
|
|
71
|
+
readonly ArrowDown: string;
|
|
72
|
+
readonly Insert: string;
|
|
73
|
+
readonly Delete: string;
|
|
74
|
+
readonly F1: string;
|
|
75
|
+
readonly F2: string;
|
|
76
|
+
readonly F3: string;
|
|
77
|
+
readonly F4: string;
|
|
78
|
+
readonly F5: string;
|
|
79
|
+
readonly F6: string;
|
|
80
|
+
readonly F7: string;
|
|
81
|
+
readonly F8: string;
|
|
82
|
+
readonly F9: string;
|
|
83
|
+
readonly F10: string;
|
|
84
|
+
readonly F11: string;
|
|
85
|
+
readonly F12: string;
|
|
86
|
+
readonly Meta: string;
|
|
87
|
+
};
|
|
88
|
+
waitFor(check: ((driver: Driver) => Promise<any> | any) | (() => Promise<any> | any), options?: WaitOptions & {
|
|
89
|
+
message?: string;
|
|
90
|
+
}): Promise<any>;
|
|
91
|
+
actions(): ActionsBuilder;
|
|
92
|
+
pause(ms: number): Promise<void>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Builder } from './builder.js';
|
|
2
|
+
import { ChromeService } from './chrome.js';
|
|
3
|
+
import { By } from './by.js';
|
|
4
|
+
import { until } from './wait.js';
|
|
5
|
+
import { ElementHandle } from './elementHandle.js';
|
|
6
|
+
import { expectSelector } from './expect.js';
|
|
7
|
+
import fs from 'fs/promises';
|
|
8
|
+
import { KeyboardController } from './keyboard.js';
|
|
9
|
+
import { Key } from './keys.js';
|
|
10
|
+
import { MouseController } from './mouse.js';
|
|
11
|
+
import { ActionsBuilder } from './actions.js';
|
|
12
|
+
export class Browser {
|
|
13
|
+
driver;
|
|
14
|
+
constructor(driver) {
|
|
15
|
+
this.driver = driver;
|
|
16
|
+
this.keyboard = new KeyboardController(this.driver);
|
|
17
|
+
this.mouse = new MouseController(this.driver);
|
|
18
|
+
}
|
|
19
|
+
static async launch(options = {}) {
|
|
20
|
+
const name = options.browserName ?? 'chrome';
|
|
21
|
+
let chromeService;
|
|
22
|
+
if (options.chromeService) {
|
|
23
|
+
chromeService = options.chromeService;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
chromeService = new ChromeService();
|
|
27
|
+
}
|
|
28
|
+
// Handle headless mode via env var
|
|
29
|
+
const headlessEnv = process.env.HEADLESS;
|
|
30
|
+
const isHeadless = headlessEnv === 'true' || headlessEnv === '1';
|
|
31
|
+
let caps;
|
|
32
|
+
if (isHeadless) {
|
|
33
|
+
caps = {
|
|
34
|
+
'goog:chromeOptions': {
|
|
35
|
+
args: ['--headless=new'],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const builder = new Builder().forBrowser(name).setChromeService(chromeService);
|
|
40
|
+
if (caps)
|
|
41
|
+
builder.withCapabilities(caps);
|
|
42
|
+
const driver = await builder.build();
|
|
43
|
+
return new Browser(driver);
|
|
44
|
+
}
|
|
45
|
+
async navigateTo(url) {
|
|
46
|
+
return this.driver.navigateTo(url);
|
|
47
|
+
}
|
|
48
|
+
async url() {
|
|
49
|
+
return this.driver.getCurrentUrl();
|
|
50
|
+
}
|
|
51
|
+
async title() {
|
|
52
|
+
return this.driver.getTitle();
|
|
53
|
+
}
|
|
54
|
+
wait(condition, a, b, c) {
|
|
55
|
+
return this.driver.wait(condition, a, b, c);
|
|
56
|
+
}
|
|
57
|
+
async quit() {
|
|
58
|
+
await this.driver.quit();
|
|
59
|
+
}
|
|
60
|
+
async click(selector) {
|
|
61
|
+
const by = typeof selector === 'string' ? By.css(selector) : selector;
|
|
62
|
+
const el = await this.driver.wait(until.elementIsVisible(by), { timeout: 5000 });
|
|
63
|
+
await el.click();
|
|
64
|
+
}
|
|
65
|
+
async type(selector, text, opts) {
|
|
66
|
+
const by = typeof selector === 'string' ? By.css(selector) : selector;
|
|
67
|
+
const el = await this.driver.wait(until.elementIsVisible(by), {
|
|
68
|
+
timeout: opts?.timeout ?? 5000,
|
|
69
|
+
});
|
|
70
|
+
await el.click();
|
|
71
|
+
await el.sendKeys(text);
|
|
72
|
+
}
|
|
73
|
+
gesture = {
|
|
74
|
+
swipe: async ({ from, to, durationMs = 300, }) => {
|
|
75
|
+
await this.driver.performTouchSwipe(from, to, durationMs);
|
|
76
|
+
},
|
|
77
|
+
pinch: async ({ center, scale = 0.5, distance = 100, durationMs = 250, }) => {
|
|
78
|
+
await this.driver.performTouchPinch(center, scale, distance, durationMs);
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
// Capture a screenshot. If selectorOrBy provided, capture element; else full page. Returns raw buffer.
|
|
82
|
+
async screenshot(selectorOrBy) {
|
|
83
|
+
if (selectorOrBy) {
|
|
84
|
+
const by = typeof selectorOrBy === 'string' ? By.css(selectorOrBy) : selectorOrBy;
|
|
85
|
+
const el = await this.driver.wait(until.elementIsVisible(by), { timeout: 5000 });
|
|
86
|
+
const b64 = await el.screenshotBase64();
|
|
87
|
+
return Buffer.from(b64, 'base64');
|
|
88
|
+
}
|
|
89
|
+
const b64 = await this.driver.screenshotBase64();
|
|
90
|
+
return Buffer.from(b64, 'base64');
|
|
91
|
+
}
|
|
92
|
+
// Convenience: capture (optionally element) screenshot and save to file, returning buffer.
|
|
93
|
+
async saveScreenshot(path, selectorOrBy) {
|
|
94
|
+
const buf = await this.screenshot(selectorOrBy);
|
|
95
|
+
await fs.writeFile(path, buf);
|
|
96
|
+
return buf;
|
|
97
|
+
}
|
|
98
|
+
expect(selector) {
|
|
99
|
+
const by = typeof selector === 'string' ? By.css(selector) : selector;
|
|
100
|
+
return expectSelector(this.driver, by);
|
|
101
|
+
}
|
|
102
|
+
find(selector) {
|
|
103
|
+
const by = typeof selector === 'string' ? By.css(selector) : selector;
|
|
104
|
+
return new ElementHandle(this.driver, by);
|
|
105
|
+
}
|
|
106
|
+
// Keyboard controller and enum for nicer usage: browser.keyboard.press(Key.Enter)
|
|
107
|
+
keyboard;
|
|
108
|
+
// Mouse controller: browser.mouse.click(...), move, down, up, wheel, dragAndDrop
|
|
109
|
+
mouse;
|
|
110
|
+
static Key = Key;
|
|
111
|
+
async waitFor(check, options) {
|
|
112
|
+
const cond = async (d) => {
|
|
113
|
+
try {
|
|
114
|
+
const r = await (check.length > 0
|
|
115
|
+
? check(d)
|
|
116
|
+
: check());
|
|
117
|
+
return r;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
return this.wait(cond, options);
|
|
124
|
+
}
|
|
125
|
+
actions() {
|
|
126
|
+
return new ActionsBuilder(this.driver);
|
|
127
|
+
}
|
|
128
|
+
// Utility: pause execution for a given number of milliseconds
|
|
129
|
+
async pause(ms) {
|
|
130
|
+
await new Promise((resolve) => setTimeout(resolve, Math.max(0, ms | 0)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAA0B,KAAK,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQ9C,MAAM,OAAO,OAAO;IACU;IAA5B,YAA4B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAyB,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC;QAC7C,IAAI,aAA4B,CAAC;QACjC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACtC,CAAC;QAED,mCAAmC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC,MAAM,UAAU,GAAG,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,GAAG,CAAC;QACjE,IAAI,IAA8B,CAAC;QACnC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,GAAG;gBACL,oBAAoB,EAAE;oBACpB,IAAI,EAAE,CAAC,gBAAgB,CAAC;iBACzB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC/E,IAAI,IAAI;YAAE,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IASD,IAAI,CAAI,SAAuB,EAAE,CAAO,EAAE,CAAO,EAAE,CAAO;QACxD,OAAQ,IAAI,CAAC,MAAc,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAqB;QAC/B,MAAM,EAAE,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAAqB,EACrB,IAAY,EACZ,IAA2C;QAE3C,MAAM,EAAE,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE;YAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI;SAC/B,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,GAAG;QACR,KAAK,EAAE,KAAK,EAAE,EACZ,IAAI,EACJ,EAAE,EACF,UAAU,GAAG,GAAG,GAKjB,EAAE,EAAE;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,EACZ,MAAM,EACN,KAAK,GAAG,GAAG,EACX,QAAQ,GAAG,GAAG,EACd,UAAU,GAAG,GAAG,GAMjB,EAAE,EAAE;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,CAAC;KACF,CAAC;IAEF,uGAAuG;IACvG,KAAK,CAAC,UAAU,CAAC,YAA0B;QACzC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAClF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,YAA0B;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,QAAqB;QAC1B,MAAM,EAAE,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,QAAqB;QACxB,MAAM,EAAE,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,kFAAkF;IAClF,QAAQ,CAAqB;IAE7B,iFAAiF;IACjF,KAAK,CAAkB;IAEvB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;IAEjB,KAAK,CAAC,OAAO,CACX,KAA4E,EAC5E,OAA4C;QAE5C,MAAM,IAAI,GAAmB,KAAK,EAAE,CAAS,EAAE,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBAC/B,CAAC,CAAE,KAA4B,CAAC,CAAC,CAAC;oBAClC,CAAC,CAAE,KAAmB,EAAE,CAAC,CAAC;gBAC5B,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAgB,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAc,CAAC,CAAC;IACzC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,KAAK,CAAC,EAAU;QACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ChromeService } from './chrome.js';
|
|
2
|
+
import { Driver } from './driver.js';
|
|
3
|
+
import { Capabilities } from './types.js';
|
|
4
|
+
export declare class Builder {
|
|
5
|
+
private browserName;
|
|
6
|
+
private chromeService;
|
|
7
|
+
private caps;
|
|
8
|
+
forBrowser(name: 'chrome' | 'chromium' | 'firefox' | string): this;
|
|
9
|
+
setChromeService(service: ChromeService): this;
|
|
10
|
+
withCapabilities(caps: Capabilities): this;
|
|
11
|
+
build(): Promise<Driver>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/lib/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,OAAO;IAClB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,IAAI,CAAoB;IAEhC,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;IAKlE,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAK9C,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKpC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAW/B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ChromeService } from './chrome.js';
|
|
2
|
+
import { Driver } from './driver.js';
|
|
3
|
+
export class Builder {
|
|
4
|
+
browserName;
|
|
5
|
+
chromeService;
|
|
6
|
+
caps = {};
|
|
7
|
+
forBrowser(name) {
|
|
8
|
+
this.browserName = name;
|
|
9
|
+
return this;
|
|
10
|
+
}
|
|
11
|
+
setChromeService(service) {
|
|
12
|
+
this.chromeService = service;
|
|
13
|
+
return this;
|
|
14
|
+
}
|
|
15
|
+
withCapabilities(caps) {
|
|
16
|
+
this.caps = { ...this.caps, ...caps };
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
async build() {
|
|
20
|
+
const name = this.browserName ?? 'chrome';
|
|
21
|
+
if (name !== 'chrome' && name !== 'chromium') {
|
|
22
|
+
throw new Error(`Only chrome/chromium supported in this initial setup. Requested: ${name}`);
|
|
23
|
+
}
|
|
24
|
+
const service = this.chromeService ?? new ChromeService();
|
|
25
|
+
await service.start();
|
|
26
|
+
const endpoint = service.getEndpoint();
|
|
27
|
+
const caps = { browserName: name, ...this.caps };
|
|
28
|
+
return await Driver.create(endpoint, caps);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/lib/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,OAAO,OAAO;IACV,WAAW,CAAqB;IAChC,aAAa,CAA4B;IACzC,IAAI,GAAiB,EAAE,CAAC;IAEhC,UAAU,CAAC,IAAgD;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,OAAsB;QACrC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,IAAkB;QACjC,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC;QAC1C,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,oEAAoE,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,aAAa,EAAE,CAAC;QAC1D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;CACF"}
|
package/dist/lib/by.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type Locator = {
|
|
2
|
+
using: string;
|
|
3
|
+
value: string;
|
|
4
|
+
};
|
|
5
|
+
export declare class By {
|
|
6
|
+
using: string;
|
|
7
|
+
value: string;
|
|
8
|
+
constructor(using: string, value: string);
|
|
9
|
+
static css(selector: string): By;
|
|
10
|
+
static xpath(xpath: string): By;
|
|
11
|
+
static id(id: string): By;
|
|
12
|
+
static nameAttr(name: string): By;
|
|
13
|
+
static className(cls: string): By;
|
|
14
|
+
static tag(tag: string): By;
|
|
15
|
+
static attr(name: string, value: string): By;
|
|
16
|
+
static dataAttr(name: string, value: string): By;
|
|
17
|
+
static aria(name: string, value: string): By;
|
|
18
|
+
static testId(value: string): By;
|
|
19
|
+
static text(text: string, opts?: {
|
|
20
|
+
caseSensitive?: boolean;
|
|
21
|
+
trim?: boolean;
|
|
22
|
+
}): By;
|
|
23
|
+
static partialText(substring: string, opts?: {
|
|
24
|
+
caseSensitive?: boolean;
|
|
25
|
+
trim?: boolean;
|
|
26
|
+
}): By;
|
|
27
|
+
static role(role: string, opts?: {
|
|
28
|
+
name?: string;
|
|
29
|
+
exact?: boolean;
|
|
30
|
+
includeHidden?: boolean;
|
|
31
|
+
}): By;
|
|
32
|
+
static labelText(text: string, opts?: {
|
|
33
|
+
exact?: boolean;
|
|
34
|
+
}): By;
|
|
35
|
+
static placeholder(text: string, opts?: {
|
|
36
|
+
exact?: boolean;
|
|
37
|
+
}): By;
|
|
38
|
+
static altText(text: string, opts?: {
|
|
39
|
+
exact?: boolean;
|
|
40
|
+
}): By;
|
|
41
|
+
static title(text: string, opts?: {
|
|
42
|
+
exact?: boolean;
|
|
43
|
+
}): By;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=by.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"by.d.ts","sourceRoot":"","sources":["../../src/lib/by.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,qBAAa,EAAE;IAEJ,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;gBADb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM;IAItB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE;IAGhC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE;IAK/B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE;IAGzB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE;IAGjC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE;IAGjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE;IAG3B,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;IAG5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;IAGhD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;IAG5C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE;IAKhC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE;IAWjF,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE;IAa7F,MAAM,CAAC,IAAI,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,EAAE;IAmBL,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE;IAU9D,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE;IAOhE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE;IAS5D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE;CAM3D"}
|