@progress/kendo-e2e 4.11.2 → 4.12.0
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 +33 -111
- package/dist/selenium/browser.d.ts +245 -4
- package/dist/selenium/browser.js +245 -4
- package/dist/selenium/browser.js.map +1 -1
- package/dist/selenium/conditions.d.ts +255 -0
- package/dist/selenium/conditions.js +251 -0
- package/dist/selenium/conditions.js.map +1 -1
- package/dist/selenium/driver-manager.d.ts +123 -0
- package/dist/selenium/driver-manager.js +118 -0
- package/dist/selenium/driver-manager.js.map +1 -1
- package/dist/selenium/electron-app.d.ts +32 -2
- package/dist/selenium/electron-app.js +32 -2
- package/dist/selenium/electron-app.js.map +1 -1
- package/dist/selenium/expect.d.ts +227 -0
- package/dist/selenium/expect.js +22 -0
- package/dist/selenium/expect.js.map +1 -1
- package/dist/selenium/web-app.d.ts +779 -9
- package/dist/selenium/web-app.js +778 -9
- package/dist/selenium/web-app.js.map +1 -1
- package/docs/API_REFERENCE.md +1309 -0
- package/docs/GETTING_STARTED.md +337 -0
- package/docs/PATTERNS.md +629 -0
- package/package.json +4 -3
|
@@ -1,7 +1,37 @@
|
|
|
1
1
|
import { WebApp } from "./web-app";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* WebDriver wrapper for testing Electron applications.
|
|
4
|
+
*
|
|
5
|
+
* Extends {@link WebApp} with Electron-specific capabilities. Use this class when testing
|
|
6
|
+
* Electron apps or VS Code extensions (which run in Electron).
|
|
7
|
+
*
|
|
8
|
+
* Unlike {@link Browser}, ElectronApp doesn't have browser chrome (address bar, refresh button,
|
|
9
|
+
* tabs, etc.) since Electron apps render within a webview context.
|
|
10
|
+
*
|
|
11
|
+
* **Features:**
|
|
12
|
+
* - All WebApp capabilities (find, click, type, wait, expect, etc.)
|
|
13
|
+
* - Automatic waiting for elements
|
|
14
|
+
* - Modern expect API
|
|
15
|
+
* - Element interaction helpers
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Testing an Electron app
|
|
20
|
+
* const electronDriver = // ... configure electron driver
|
|
21
|
+
* const app = new ElectronApp(electronDriver);
|
|
22
|
+
*
|
|
23
|
+
* await app.click('#menu-file');
|
|
24
|
+
* await app.click('#menu-new');
|
|
25
|
+
* await app.expect('.editor').toBeVisible();
|
|
26
|
+
*
|
|
27
|
+
* // Testing VS Code extension
|
|
28
|
+
* const vscode = new ElectronApp(vscodeDriver);
|
|
29
|
+
* await vscode.type('.monaco-editor textarea', 'console.log("test");');
|
|
30
|
+
* await vscode.sendControlKeyCombination('s'); // Save
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @see {@link WebApp} for all available methods
|
|
34
|
+
* @see {@link Browser} for browser-specific testing
|
|
5
35
|
*/
|
|
6
36
|
export declare class ElectronApp extends WebApp {
|
|
7
37
|
}
|
|
@@ -3,8 +3,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ElectronApp = void 0;
|
|
4
4
|
const web_app_1 = require("./web-app");
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* WebDriver wrapper for testing Electron applications.
|
|
7
|
+
*
|
|
8
|
+
* Extends {@link WebApp} with Electron-specific capabilities. Use this class when testing
|
|
9
|
+
* Electron apps or VS Code extensions (which run in Electron).
|
|
10
|
+
*
|
|
11
|
+
* Unlike {@link Browser}, ElectronApp doesn't have browser chrome (address bar, refresh button,
|
|
12
|
+
* tabs, etc.) since Electron apps render within a webview context.
|
|
13
|
+
*
|
|
14
|
+
* **Features:**
|
|
15
|
+
* - All WebApp capabilities (find, click, type, wait, expect, etc.)
|
|
16
|
+
* - Automatic waiting for elements
|
|
17
|
+
* - Modern expect API
|
|
18
|
+
* - Element interaction helpers
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Testing an Electron app
|
|
23
|
+
* const electronDriver = // ... configure electron driver
|
|
24
|
+
* const app = new ElectronApp(electronDriver);
|
|
25
|
+
*
|
|
26
|
+
* await app.click('#menu-file');
|
|
27
|
+
* await app.click('#menu-new');
|
|
28
|
+
* await app.expect('.editor').toBeVisible();
|
|
29
|
+
*
|
|
30
|
+
* // Testing VS Code extension
|
|
31
|
+
* const vscode = new ElectronApp(vscodeDriver);
|
|
32
|
+
* await vscode.type('.monaco-editor textarea', 'console.log("test");');
|
|
33
|
+
* await vscode.sendControlKeyCombination('s'); // Save
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @see {@link WebApp} for all available methods
|
|
37
|
+
* @see {@link Browser} for browser-specific testing
|
|
8
38
|
*/
|
|
9
39
|
class ElectronApp extends web_app_1.WebApp {
|
|
10
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron-app.js","sourceRoot":"","sources":["../../src/selenium/electron-app.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"electron-app.js","sourceRoot":"","sources":["../../src/selenium/electron-app.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAa,WAAY,SAAQ,gBAAM;CACtC;AADD,kCACC"}
|
|
@@ -1,22 +1,249 @@
|
|
|
1
1
|
import { By, ThenableWebDriver } from "selenium-webdriver";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration options for expect assertions.
|
|
4
|
+
*/
|
|
2
5
|
export interface ExpectOptions {
|
|
6
|
+
/** Maximum time to wait for condition in milliseconds (default: 3000) */
|
|
3
7
|
timeout?: number;
|
|
8
|
+
/** Custom error message to show if assertion fails */
|
|
4
9
|
message?: string;
|
|
10
|
+
/** Interval between retry attempts in milliseconds (default: 25) */
|
|
5
11
|
pollInterval?: number;
|
|
6
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Configuration options for attribute/class expect assertions.
|
|
15
|
+
*/
|
|
7
16
|
export interface ExpectAttributeOptions extends ExpectOptions {
|
|
17
|
+
/** If true, requires exact match; if false, allows partial match (default: true) */
|
|
8
18
|
exactMatch?: boolean;
|
|
9
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Modern, fluent API for asserting element states with automatic retry logic.
|
|
22
|
+
*
|
|
23
|
+
* Provides a Playwright-style expect API with built-in waiting and retry.
|
|
24
|
+
* All assertions automatically retry until they pass or timeout is reached,
|
|
25
|
+
* eliminating the need for manual waits.
|
|
26
|
+
*
|
|
27
|
+
* **Key features:**
|
|
28
|
+
* - Automatic retry with configurable timeout (default 3s)
|
|
29
|
+
* - Clear error messages showing what was expected vs actual
|
|
30
|
+
* - Support for regex patterns in text matching
|
|
31
|
+
* - Negative assertions via `.not` property
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // Basic assertions
|
|
36
|
+
* await app.expect('#title').toHaveText('Welcome');
|
|
37
|
+
* await app.expect('.modal').toBeVisible();
|
|
38
|
+
* await app.expect('#input').toHaveValue('test');
|
|
39
|
+
*
|
|
40
|
+
* // With timeout
|
|
41
|
+
* await app.expect('#message').toHaveText('Success', { timeout: 5000 });
|
|
42
|
+
*
|
|
43
|
+
* // Regex matching
|
|
44
|
+
* await app.expect('#status').toHaveText(/complete|success/i);
|
|
45
|
+
*
|
|
46
|
+
* // Negative assertions
|
|
47
|
+
* await app.expect('.spinner').not.toBeVisible();
|
|
48
|
+
* await app.expect('#input').not.toHaveFocus();
|
|
49
|
+
*
|
|
50
|
+
* // Attribute checks
|
|
51
|
+
* await app.expect('#submit').toHaveAttribute('disabled', 'true');
|
|
52
|
+
* await app.expect('.item').toHaveClass('selected');
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
10
55
|
export interface ExpectApi {
|
|
56
|
+
/**
|
|
57
|
+
* Asserts that element has specific text content.
|
|
58
|
+
*
|
|
59
|
+
* Continuously retries until text matches or timeout is reached.
|
|
60
|
+
* Supports both exact string match and regex patterns.
|
|
61
|
+
* Text is trimmed before comparison.
|
|
62
|
+
*
|
|
63
|
+
* @param text - Expected text (string for exact match or RegExp for pattern match)
|
|
64
|
+
* @param opts - Optional configuration (timeout, message, pollInterval)
|
|
65
|
+
* @throws Error if element doesn't have expected text within timeout
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* // Exact match
|
|
70
|
+
* await app.expect('#message').toHaveText('Operation completed');
|
|
71
|
+
*
|
|
72
|
+
* // Regex pattern
|
|
73
|
+
* await app.expect('#status').toHaveText(/success|complete/i);
|
|
74
|
+
*
|
|
75
|
+
* // With custom timeout
|
|
76
|
+
* await app.expect('#slow-load').toHaveText('Loaded', { timeout: 10000 });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
11
79
|
toHaveText(text: string | RegExp, opts?: ExpectOptions): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Asserts that element is visible on the page.
|
|
82
|
+
*
|
|
83
|
+
* Element must be present in DOM and have CSS properties that make it visible.
|
|
84
|
+
* Continuously retries until visible or timeout is reached.
|
|
85
|
+
*
|
|
86
|
+
* @param opts - Optional configuration (timeout, message, pollInterval)
|
|
87
|
+
* @throws Error if element is not visible within timeout
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* // Wait for modal to appear
|
|
92
|
+
* await app.expect('.modal').toBeVisible();
|
|
93
|
+
*
|
|
94
|
+
* // With custom timeout and message
|
|
95
|
+
* await app.expect('#notification').toBeVisible({
|
|
96
|
+
* timeout: 5000,
|
|
97
|
+
* message: 'Notification did not appear'
|
|
98
|
+
* });
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
12
101
|
toBeVisible(opts?: ExpectOptions): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Asserts that input element has specific value.
|
|
104
|
+
*
|
|
105
|
+
* Checks the 'value' attribute of form inputs. Perfect for validating
|
|
106
|
+
* input fields, textareas, and other form elements.
|
|
107
|
+
*
|
|
108
|
+
* @param value - Expected value string
|
|
109
|
+
* @param opts - Optional configuration (timeout, message, pollInterval)
|
|
110
|
+
* @throws Error if element doesn't have expected value within timeout
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // Check input value after typing
|
|
115
|
+
* await app.type('#username', 'testuser');
|
|
116
|
+
* await app.expect('#username').toHaveValue('testuser');
|
|
117
|
+
*
|
|
118
|
+
* // Verify auto-filled value
|
|
119
|
+
* await app.expect('#email').toHaveValue('user@example.com');
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
13
122
|
toHaveValue(value: string, opts?: ExpectOptions): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Asserts that element has keyboard focus.
|
|
125
|
+
*
|
|
126
|
+
* Verifies that the element is the currently active (focused) element.
|
|
127
|
+
* Useful for testing keyboard navigation and accessibility.
|
|
128
|
+
*
|
|
129
|
+
* @param opts - Optional configuration (timeout, message, pollInterval)
|
|
130
|
+
* @throws Error if element doesn't receive focus within timeout
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* // Verify focus after click
|
|
135
|
+
* await app.click('#search');
|
|
136
|
+
* await app.expect('#search').toHaveFocus();
|
|
137
|
+
*
|
|
138
|
+
* // Check focus after Tab navigation
|
|
139
|
+
* await app.sendKey(Key.TAB);
|
|
140
|
+
* await app.expect('#next-field').toHaveFocus();
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
14
143
|
toHaveFocus(opts?: ExpectOptions): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Asserts that element has specific attribute value.
|
|
146
|
+
*
|
|
147
|
+
* Can check for exact match or partial match (contains).
|
|
148
|
+
* Useful for validating data attributes, ARIA attributes, disabled state, etc.
|
|
149
|
+
*
|
|
150
|
+
* @param attribute - Attribute name (e.g., 'disabled', 'data-id', 'aria-label')
|
|
151
|
+
* @param value - Expected value
|
|
152
|
+
* @param opts - Optional configuration (timeout, message, pollInterval, exactMatch)
|
|
153
|
+
* @throws Error if attribute doesn't have expected value within timeout
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* // Check if button is disabled
|
|
158
|
+
* await app.expect('#submit').toHaveAttribute('disabled', 'true');
|
|
159
|
+
*
|
|
160
|
+
* // Verify data attribute
|
|
161
|
+
* await app.expect('.item').toHaveAttribute('data-id', '123');
|
|
162
|
+
*
|
|
163
|
+
* // Partial match for class
|
|
164
|
+
* await app.expect('#div').toHaveAttribute('class', 'active', { exactMatch: false });
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
15
167
|
toHaveAttribute(attribute: string, value: string, opts?: ExpectAttributeOptions): Promise<void>;
|
|
168
|
+
/**
|
|
169
|
+
* Asserts that element has specific CSS class.
|
|
170
|
+
*
|
|
171
|
+
* Convenience method for checking the 'class' attribute.
|
|
172
|
+
* By default does partial match (class list contains the value).
|
|
173
|
+
*
|
|
174
|
+
* @param className - Class name to check for
|
|
175
|
+
* @param opts - Optional configuration (timeout, message, pollInterval, exactMatch)
|
|
176
|
+
* @throws Error if element doesn't have expected class within timeout
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* // Check if element has class (partial match)
|
|
181
|
+
* await app.expect('#button').toHaveClass('active');
|
|
182
|
+
*
|
|
183
|
+
* // Exact class match
|
|
184
|
+
* await app.expect('#div').toHaveClass('btn btn-primary', { exactMatch: true });
|
|
185
|
+
*
|
|
186
|
+
* // Wait for class to be added
|
|
187
|
+
* await app.click('#toggle');
|
|
188
|
+
* await app.expect('.panel').toHaveClass('expanded');
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
16
191
|
toHaveClass(className: string, opts?: ExpectAttributeOptions): Promise<void>;
|
|
192
|
+
/**
|
|
193
|
+
* Negative assertions - opposite of the main assertions.
|
|
194
|
+
*/
|
|
17
195
|
not: {
|
|
196
|
+
/**
|
|
197
|
+
* Asserts that element is NOT visible.
|
|
198
|
+
*
|
|
199
|
+
* Waits for element to become hidden or be removed from DOM.
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```typescript
|
|
203
|
+
* // Wait for spinner to disappear
|
|
204
|
+
* await app.expect('.spinner').not.toBeVisible();
|
|
205
|
+
*
|
|
206
|
+
* // Verify modal closed
|
|
207
|
+
* await app.click('.modal .close');
|
|
208
|
+
* await app.expect('.modal').not.toBeVisible();
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
18
211
|
toBeVisible(opts?: ExpectOptions): Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Asserts that element does NOT have focus.
|
|
214
|
+
*
|
|
215
|
+
* Waits for element to lose keyboard focus.
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```typescript
|
|
219
|
+
* // Verify focus moved away
|
|
220
|
+
* await app.sendKey(Key.TAB);
|
|
221
|
+
* await app.expect('#previous-field').not.toHaveFocus();
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
19
224
|
toHaveFocus(opts?: ExpectOptions): Promise<void>;
|
|
20
225
|
};
|
|
21
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Creates an ExpectApi instance for a specific element selector.
|
|
229
|
+
*
|
|
230
|
+
* This is the factory function that creates the fluent expect API.
|
|
231
|
+
* Typically called via `app.expect(selector)` rather than directly.
|
|
232
|
+
*
|
|
233
|
+
* @param driver - WebDriver instance
|
|
234
|
+
* @param by - By locator for the element to create expectations for
|
|
235
|
+
* @returns ExpectApi instance with assertion methods
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```typescript
|
|
239
|
+
* // Usually used via app.expect()
|
|
240
|
+
* await app.expect('#title').toHaveText('Welcome');
|
|
241
|
+
*
|
|
242
|
+
* // But can be used directly
|
|
243
|
+
* const api = expectSelector(driver, By.css('#element'));
|
|
244
|
+
* await api.toBeVisible();
|
|
245
|
+
* ```
|
|
246
|
+
*
|
|
247
|
+
* @internal This is typically used internally by WebApp.expect()
|
|
248
|
+
*/
|
|
22
249
|
export declare function expectSelector(driver: ThenableWebDriver, by: By): ExpectApi;
|
package/dist/selenium/expect.js
CHANGED
|
@@ -10,6 +10,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.expectSelector = expectSelector;
|
|
13
|
+
/**
|
|
14
|
+
* Creates an ExpectApi instance for a specific element selector.
|
|
15
|
+
*
|
|
16
|
+
* This is the factory function that creates the fluent expect API.
|
|
17
|
+
* Typically called via `app.expect(selector)` rather than directly.
|
|
18
|
+
*
|
|
19
|
+
* @param driver - WebDriver instance
|
|
20
|
+
* @param by - By locator for the element to create expectations for
|
|
21
|
+
* @returns ExpectApi instance with assertion methods
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Usually used via app.expect()
|
|
26
|
+
* await app.expect('#title').toHaveText('Welcome');
|
|
27
|
+
*
|
|
28
|
+
* // But can be used directly
|
|
29
|
+
* const api = expectSelector(driver, By.css('#element'));
|
|
30
|
+
* await api.toBeVisible();
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @internal This is typically used internally by WebApp.expect()
|
|
34
|
+
*/
|
|
13
35
|
function expectSelector(driver, by) {
|
|
14
36
|
const DEFAULT_TIMEOUT = 3000;
|
|
15
37
|
const DEFAULT_POLL_INTERVAL = 25;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expect.js","sourceRoot":"","sources":["../../src/selenium/expect.ts"],"names":[],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"expect.js","sourceRoot":"","sources":["../../src/selenium/expect.ts"],"names":[],"mappings":"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"}
|