@theia/playwright 1.48.1 → 1.48.2
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 +54 -54
- package/lib/index.d.ts +30 -30
- package/lib/index.js +48 -48
- package/lib/tests/theia-app.test.d.ts +1 -1
- package/lib/tests/theia-app.test.js +29 -29
- package/lib/tests/theia-application-shell.test.d.ts +1 -1
- package/lib/tests/theia-application-shell.test.js +57 -57
- package/lib/tests/theia-explorer-view.test.d.ts +1 -1
- package/lib/tests/theia-explorer-view.test.js +183 -183
- package/lib/tests/theia-getting-started.test.d.ts +1 -1
- package/lib/tests/theia-getting-started.test.js +45 -45
- package/lib/tests/theia-main-menu.test.d.ts +1 -1
- package/lib/tests/theia-main-menu.test.js +111 -111
- package/lib/tests/theia-output-view.test.d.ts +1 -1
- package/lib/tests/theia-output-view.test.js +78 -78
- package/lib/tests/theia-preference-view.test.d.ts +1 -1
- package/lib/tests/theia-preference-view.test.js +101 -101
- package/lib/tests/theia-problems-view.test.d.ts +1 -1
- package/lib/tests/theia-problems-view.test.js +54 -54
- package/lib/tests/theia-quick-command.test.d.ts +1 -1
- package/lib/tests/theia-quick-command.test.js +69 -69
- package/lib/tests/theia-sample-app.test.d.ts +1 -1
- package/lib/tests/theia-sample-app.test.js +57 -57
- package/lib/tests/theia-status-bar.test.d.ts +1 -1
- package/lib/tests/theia-status-bar.test.js +44 -44
- package/lib/tests/theia-terminal-view.test.d.ts +1 -1
- package/lib/tests/theia-terminal-view.test.js +78 -78
- package/lib/tests/theia-text-editor.test.d.ts +1 -1
- package/lib/tests/theia-text-editor.test.js +155 -155
- package/lib/tests/theia-toolbar.test.d.ts +1 -1
- package/lib/tests/theia-toolbar.test.js +61 -61
- package/lib/tests/theia-workspace.test.d.ts +1 -1
- package/lib/tests/theia-workspace.test.js +72 -72
- package/lib/theia-about-dialog.d.ts +4 -4
- package/lib/theia-about-dialog.js +26 -26
- package/lib/theia-app-loader.d.ts +19 -19
- package/lib/theia-app-loader.js +129 -129
- package/lib/theia-app.d.ts +50 -50
- package/lib/theia-app.js +153 -153
- package/lib/theia-context-menu.d.ts +8 -8
- package/lib/theia-context-menu.js +37 -37
- package/lib/theia-dialog.d.ts +28 -28
- package/lib/theia-dialog.js +99 -99
- package/lib/theia-editor.d.ts +9 -9
- package/lib/theia-editor.js +68 -68
- package/lib/theia-explorer-view.d.ts +47 -47
- package/lib/theia-explorer-view.js +273 -273
- package/lib/theia-main-menu.d.ts +12 -12
- package/lib/theia-main-menu.js +53 -53
- package/lib/theia-menu-item.d.ts +14 -14
- package/lib/theia-menu-item.js +66 -66
- package/lib/theia-menu.d.ts +16 -16
- package/lib/theia-menu.js +86 -86
- package/lib/theia-monaco-editor.d.ts +15 -15
- package/lib/theia-monaco-editor.js +75 -75
- package/lib/theia-notification-indicator.d.ts +7 -7
- package/lib/theia-notification-indicator.js +44 -44
- package/lib/theia-notification-overlay.d.ts +22 -22
- package/lib/theia-notification-overlay.js +79 -79
- package/lib/theia-output-channel.d.ts +24 -24
- package/lib/theia-output-channel.js +71 -71
- package/lib/theia-output-view.d.ts +9 -9
- package/lib/theia-output-view.js +81 -81
- package/lib/theia-page-object.d.ts +7 -7
- package/lib/theia-page-object.js +27 -27
- package/lib/theia-preference-view.d.ts +84 -84
- package/lib/theia-preference-view.js +209 -209
- package/lib/theia-problem-indicator.d.ts +8 -8
- package/lib/theia-problem-indicator.js +38 -38
- package/lib/theia-problem-view.d.ts +5 -5
- package/lib/theia-problem-view.js +30 -30
- package/lib/theia-quick-command-palette.d.ts +12 -12
- package/lib/theia-quick-command-palette.js +78 -78
- package/lib/theia-rename-dialog.d.ts +5 -5
- package/lib/theia-rename-dialog.js +34 -34
- package/lib/theia-status-bar.d.ts +13 -13
- package/lib/theia-status-bar.js +39 -39
- package/lib/theia-status-indicator.d.ts +10 -10
- package/lib/theia-status-indicator.js +48 -48
- package/lib/theia-terminal.d.ts +13 -13
- package/lib/theia-terminal.js +59 -59
- package/lib/theia-text-editor.d.ts +26 -26
- package/lib/theia-text-editor.js +120 -120
- package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
- package/lib/theia-toggle-bottom-indicator.js +26 -26
- package/lib/theia-toolbar-item.d.ts +10 -10
- package/lib/theia-toolbar-item.js +39 -39
- package/lib/theia-toolbar.d.ts +19 -19
- package/lib/theia-toolbar.js +90 -90
- package/lib/theia-tree-node.d.ts +19 -19
- package/lib/theia-tree-node.js +72 -72
- package/lib/theia-view.d.ts +32 -32
- package/lib/theia-view.js +149 -149
- package/lib/theia-welcome-view.d.ts +5 -5
- package/lib/theia-welcome-view.js +30 -30
- package/lib/theia-workspace.d.ts +18 -18
- package/lib/theia-workspace.js +69 -69
- package/lib/util.d.ts +19 -19
- package/lib/util.js +93 -93
- package/package.json +2 -2
- package/src/index.ts +46 -46
- package/src/tests/resources/sample-files1/sample.txt +4 -4
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
- package/src/tests/resources/sample-files2/another-sample.txt +1 -1
- package/src/tests/theia-app.test.ts +33 -33
- package/src/tests/theia-application-shell.test.ts +67 -67
- package/src/tests/theia-explorer-view.test.ts +211 -211
- package/src/tests/theia-getting-started.test.ts +50 -50
- package/src/tests/theia-main-menu.test.ts +133 -133
- package/src/tests/theia-output-view.test.ts +85 -85
- package/src/tests/theia-preference-view.test.ts +122 -122
- package/src/tests/theia-problems-view.test.ts +64 -64
- package/src/tests/theia-quick-command.test.ts +80 -80
- package/src/tests/theia-sample-app.test.ts +66 -66
- package/src/tests/theia-status-bar.test.ts +52 -52
- package/src/tests/theia-terminal-view.test.ts +90 -90
- package/src/tests/theia-text-editor.test.ts +187 -187
- package/src/tests/theia-toolbar.test.ts +69 -69
- package/src/tests/theia-workspace.test.ts +80 -80
- package/src/theia-about-dialog.ts +26 -26
- package/src/theia-app-loader.ts +167 -167
- package/src/theia-app.ts +188 -188
- package/src/theia-context-menu.ts +42 -42
- package/src/theia-dialog.ts +114 -114
- package/src/theia-editor.ts +73 -73
- package/src/theia-explorer-view.ts +311 -311
- package/src/theia-main-menu.ts +54 -54
- package/src/theia-menu-item.ts +75 -75
- package/src/theia-menu.ts +96 -96
- package/src/theia-monaco-editor.ts +83 -83
- package/src/theia-notification-indicator.ts +44 -44
- package/src/theia-notification-overlay.ts +94 -94
- package/src/theia-output-channel.ts +88 -88
- package/src/theia-output-view.ts +87 -87
- package/src/theia-page-object.ts +29 -29
- package/src/theia-preference-view.ts +240 -240
- package/src/theia-problem-indicator.ts +37 -37
- package/src/theia-problem-view.ts +30 -30
- package/src/theia-quick-command-palette.ts +81 -81
- package/src/theia-rename-dialog.ts +35 -35
- package/src/theia-status-bar.ts +44 -44
- package/src/theia-status-indicator.ts +50 -50
- package/src/theia-terminal.ts +69 -69
- package/src/theia-text-editor.ts +141 -141
- package/src/theia-toggle-bottom-indicator.ts +21 -21
- package/src/theia-toolbar-item.ts +41 -41
- package/src/theia-toolbar.ts +99 -99
- package/src/theia-tree-node.ts +81 -81
- package/src/theia-view.ts +177 -177
- package/src/theia-welcome-view.ts +31 -31
- package/src/theia-workspace.ts +76 -76
- package/src/util.ts +91 -91
package/src/theia-workspace.ts
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
|
|
3
|
-
//
|
|
4
|
-
// This program and the accompanying materials are made available under the
|
|
5
|
-
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
-
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
-
//
|
|
8
|
-
// This Source Code may also be made available under the following Secondary
|
|
9
|
-
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
-
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
-
// with the GNU Classpath Exception which is available at
|
|
12
|
-
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
-
//
|
|
14
|
-
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
|
|
17
|
-
import * as fs from 'fs-extra';
|
|
18
|
-
import { resolve } from 'path';
|
|
19
|
-
import { OSUtil, urlEncodePath } from './util';
|
|
20
|
-
|
|
21
|
-
export class TheiaWorkspace {
|
|
22
|
-
|
|
23
|
-
protected workspacePath: string;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Creates a Theia workspace location with the specified path to files that shall be copied to this workspace.
|
|
27
|
-
* The `pathOfFilesToInitialize` must be relative to cwd of the node process.
|
|
28
|
-
*
|
|
29
|
-
* @param {string[]} pathOfFilesToInitialize Path to files or folders that shall be copied to the workspace
|
|
30
|
-
*/
|
|
31
|
-
constructor(protected pathOfFilesToInitialize?: string[]) {
|
|
32
|
-
this.workspacePath = fs.mkdtempSync(`${OSUtil.tmpDir}${OSUtil.fileSeparator}cloud-ws-`);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Performs the file system operations preparing the workspace location synchronously. */
|
|
36
|
-
initialize(): void {
|
|
37
|
-
if (this.pathOfFilesToInitialize) {
|
|
38
|
-
for (const initPath of this.pathOfFilesToInitialize) {
|
|
39
|
-
const absoluteInitPath = resolve(process.cwd(), initPath);
|
|
40
|
-
if (!fs.pathExistsSync(absoluteInitPath)) {
|
|
41
|
-
throw Error('Workspace does not exist at ' + absoluteInitPath);
|
|
42
|
-
}
|
|
43
|
-
fs.copySync(absoluteInitPath, this.workspacePath);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
get path(): string {
|
|
49
|
-
let workspacePath = this.workspacePath;
|
|
50
|
-
if (!OSUtil.osStartsWithFileSeparator(this.workspacePath)) {
|
|
51
|
-
workspacePath = `${OSUtil.fileSeparator}${workspacePath}`;
|
|
52
|
-
}
|
|
53
|
-
if (OSUtil.isWindows) {
|
|
54
|
-
// Drive letters in windows paths have to be lower case
|
|
55
|
-
workspacePath = workspacePath.replace(/.:/, matchedChar => matchedChar.toLowerCase());
|
|
56
|
-
}
|
|
57
|
-
return workspacePath;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
get urlEncodedPath(): string {
|
|
61
|
-
return urlEncodePath(this.path);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
get escapedPath(): string {
|
|
65
|
-
return this.path.replace(/:/g, '%3A');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
clear(): void {
|
|
69
|
-
fs.emptyDirSync(this.workspacePath);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
remove(): void {
|
|
73
|
-
fs.removeSync(this.workspacePath);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import * as fs from 'fs-extra';
|
|
18
|
+
import { resolve } from 'path';
|
|
19
|
+
import { OSUtil, urlEncodePath } from './util';
|
|
20
|
+
|
|
21
|
+
export class TheiaWorkspace {
|
|
22
|
+
|
|
23
|
+
protected workspacePath: string;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Creates a Theia workspace location with the specified path to files that shall be copied to this workspace.
|
|
27
|
+
* The `pathOfFilesToInitialize` must be relative to cwd of the node process.
|
|
28
|
+
*
|
|
29
|
+
* @param {string[]} pathOfFilesToInitialize Path to files or folders that shall be copied to the workspace
|
|
30
|
+
*/
|
|
31
|
+
constructor(protected pathOfFilesToInitialize?: string[]) {
|
|
32
|
+
this.workspacePath = fs.mkdtempSync(`${OSUtil.tmpDir}${OSUtil.fileSeparator}cloud-ws-`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Performs the file system operations preparing the workspace location synchronously. */
|
|
36
|
+
initialize(): void {
|
|
37
|
+
if (this.pathOfFilesToInitialize) {
|
|
38
|
+
for (const initPath of this.pathOfFilesToInitialize) {
|
|
39
|
+
const absoluteInitPath = resolve(process.cwd(), initPath);
|
|
40
|
+
if (!fs.pathExistsSync(absoluteInitPath)) {
|
|
41
|
+
throw Error('Workspace does not exist at ' + absoluteInitPath);
|
|
42
|
+
}
|
|
43
|
+
fs.copySync(absoluteInitPath, this.workspacePath);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get path(): string {
|
|
49
|
+
let workspacePath = this.workspacePath;
|
|
50
|
+
if (!OSUtil.osStartsWithFileSeparator(this.workspacePath)) {
|
|
51
|
+
workspacePath = `${OSUtil.fileSeparator}${workspacePath}`;
|
|
52
|
+
}
|
|
53
|
+
if (OSUtil.isWindows) {
|
|
54
|
+
// Drive letters in windows paths have to be lower case
|
|
55
|
+
workspacePath = workspacePath.replace(/.:/, matchedChar => matchedChar.toLowerCase());
|
|
56
|
+
}
|
|
57
|
+
return workspacePath;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get urlEncodedPath(): string {
|
|
61
|
+
return urlEncodePath(this.path);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
get escapedPath(): string {
|
|
65
|
+
return this.path.replace(/:/g, '%3A');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
clear(): void {
|
|
69
|
+
fs.emptyDirSync(this.workspacePath);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
remove(): void {
|
|
73
|
+
fs.removeSync(this.workspacePath);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
}
|
package/src/util.ts
CHANGED
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
|
|
3
|
-
//
|
|
4
|
-
// This program and the accompanying materials are made available under the
|
|
5
|
-
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
-
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
-
//
|
|
8
|
-
// This Source Code may also be made available under the following Secondary
|
|
9
|
-
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
-
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
-
// with the GNU Classpath Exception which is available at
|
|
12
|
-
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
-
//
|
|
14
|
-
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
|
|
17
|
-
import { ElementHandle } from '@playwright/test';
|
|
18
|
-
import { tmpdir, platform } from 'os';
|
|
19
|
-
import { sep } from 'path';
|
|
20
|
-
|
|
21
|
-
export const USER_KEY_TYPING_DELAY = 80;
|
|
22
|
-
|
|
23
|
-
export function normalizeId(nodeId: string): string {
|
|
24
|
-
// Special characters (i.e. in our case '.',':','/','%', and '\\') in CSS IDs have to be escaped
|
|
25
|
-
return nodeId.replace(/[.:,%/\\]/g, matchedChar => '\\' + matchedChar);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function urlEncodePath(path: string): string {
|
|
29
|
-
return path.replace(/\\/g, '/');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export async function toTextContentArray(items: ElementHandle<SVGElement | HTMLElement>[]): Promise<string[]> {
|
|
33
|
-
const contents = items.map(item => item.textContent());
|
|
34
|
-
const resolvedContents = await Promise.all(contents);
|
|
35
|
-
return resolvedContents.filter(text => text !== undefined) as string[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function isDefined(content: string | undefined): content is string {
|
|
39
|
-
return content !== undefined;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function isNotNull(content: string | null): content is string {
|
|
43
|
-
return content !== null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function textContent(elementPromise: Promise<ElementHandle<SVGElement | HTMLElement> | null>): Promise<string | undefined> {
|
|
47
|
-
const element = await elementPromise;
|
|
48
|
-
if (!element) {
|
|
49
|
-
return undefined;
|
|
50
|
-
}
|
|
51
|
-
const content = await element.textContent();
|
|
52
|
-
return content ? content : undefined;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export async function containsClass(elementPromise: Promise<ElementHandle<SVGElement | HTMLElement> | null> | undefined, cssClass: string): Promise<boolean> {
|
|
56
|
-
return elementContainsClass(await elementPromise, cssClass);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export async function elementContainsClass(element: ElementHandle<SVGElement | HTMLElement> | null | undefined, cssClass: string): Promise<boolean> {
|
|
60
|
-
if (element) {
|
|
61
|
-
const classValue = await element.getAttribute('class');
|
|
62
|
-
if (classValue) {
|
|
63
|
-
return classValue?.split(' ').includes(cssClass);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export async function isElementVisible(elementPromise: Promise<ElementHandle<SVGElement | HTMLElement> | null>): Promise<boolean> {
|
|
70
|
-
const element = await elementPromise;
|
|
71
|
-
return element ? element.isVisible() : false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export async function elementId(element: ElementHandle<SVGElement | HTMLElement>): Promise<string> {
|
|
75
|
-
const id = await element.getAttribute('id');
|
|
76
|
-
if (id === null) { throw new Error('Could not get ID of ' + element); }
|
|
77
|
-
return id;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export namespace OSUtil {
|
|
81
|
-
export const isWindows = platform() === 'win32';
|
|
82
|
-
export const isMacOS = platform() === 'darwin';
|
|
83
|
-
// The platform-specific file separator '\' or '/'.
|
|
84
|
-
export const fileSeparator = sep;
|
|
85
|
-
// The platform-specific location of the temporary directory.
|
|
86
|
-
export const tmpDir = tmpdir();
|
|
87
|
-
|
|
88
|
-
export function osStartsWithFileSeparator(path: string): boolean {
|
|
89
|
-
return path.startsWith(fileSeparator);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { ElementHandle } from '@playwright/test';
|
|
18
|
+
import { tmpdir, platform } from 'os';
|
|
19
|
+
import { sep } from 'path';
|
|
20
|
+
|
|
21
|
+
export const USER_KEY_TYPING_DELAY = 80;
|
|
22
|
+
|
|
23
|
+
export function normalizeId(nodeId: string): string {
|
|
24
|
+
// Special characters (i.e. in our case '.',':','/','%', and '\\') in CSS IDs have to be escaped
|
|
25
|
+
return nodeId.replace(/[.:,%/\\]/g, matchedChar => '\\' + matchedChar);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function urlEncodePath(path: string): string {
|
|
29
|
+
return path.replace(/\\/g, '/');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function toTextContentArray(items: ElementHandle<SVGElement | HTMLElement>[]): Promise<string[]> {
|
|
33
|
+
const contents = items.map(item => item.textContent());
|
|
34
|
+
const resolvedContents = await Promise.all(contents);
|
|
35
|
+
return resolvedContents.filter(text => text !== undefined) as string[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function isDefined(content: string | undefined): content is string {
|
|
39
|
+
return content !== undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function isNotNull(content: string | null): content is string {
|
|
43
|
+
return content !== null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function textContent(elementPromise: Promise<ElementHandle<SVGElement | HTMLElement> | null>): Promise<string | undefined> {
|
|
47
|
+
const element = await elementPromise;
|
|
48
|
+
if (!element) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const content = await element.textContent();
|
|
52
|
+
return content ? content : undefined;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function containsClass(elementPromise: Promise<ElementHandle<SVGElement | HTMLElement> | null> | undefined, cssClass: string): Promise<boolean> {
|
|
56
|
+
return elementContainsClass(await elementPromise, cssClass);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function elementContainsClass(element: ElementHandle<SVGElement | HTMLElement> | null | undefined, cssClass: string): Promise<boolean> {
|
|
60
|
+
if (element) {
|
|
61
|
+
const classValue = await element.getAttribute('class');
|
|
62
|
+
if (classValue) {
|
|
63
|
+
return classValue?.split(' ').includes(cssClass);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export async function isElementVisible(elementPromise: Promise<ElementHandle<SVGElement | HTMLElement> | null>): Promise<boolean> {
|
|
70
|
+
const element = await elementPromise;
|
|
71
|
+
return element ? element.isVisible() : false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export async function elementId(element: ElementHandle<SVGElement | HTMLElement>): Promise<string> {
|
|
75
|
+
const id = await element.getAttribute('id');
|
|
76
|
+
if (id === null) { throw new Error('Could not get ID of ' + element); }
|
|
77
|
+
return id;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export namespace OSUtil {
|
|
81
|
+
export const isWindows = platform() === 'win32';
|
|
82
|
+
export const isMacOS = platform() === 'darwin';
|
|
83
|
+
// The platform-specific file separator '\' or '/'.
|
|
84
|
+
export const fileSeparator = sep;
|
|
85
|
+
// The platform-specific location of the temporary directory.
|
|
86
|
+
export const tmpDir = tmpdir();
|
|
87
|
+
|
|
88
|
+
export function osStartsWithFileSeparator(path: string): boolean {
|
|
89
|
+
return path.startsWith(fileSeparator);
|
|
90
|
+
}
|
|
91
|
+
}
|