sefiutils 1.0.0 → 1.0.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 +46 -12
- package/lib/fiberUtils.d.ts +13 -0
- package/lib/fiberUtils.d.ts.map +1 -0
- package/lib/fiberUtils.js +60 -0
- package/lib/fiberUtils.js.map +1 -0
- package/lib/globalSetup.d.ts +22 -0
- package/lib/globalSetup.d.ts.map +1 -0
- package/lib/globalSetup.js +88 -0
- package/lib/globalSetup.js.map +1 -0
- package/{src/globalTeardown.ts → lib/globalTeardown.d.ts} +5 -12
- package/lib/globalTeardown.d.ts.map +1 -0
- package/lib/globalTeardown.js +34 -0
- package/lib/globalTeardown.js.map +1 -0
- package/lib/localSetup.d.ts +4 -0
- package/lib/localSetup.d.ts.map +1 -0
- package/lib/localSetup.js +139 -0
- package/lib/localSetup.js.map +1 -0
- package/lib/localTeardown.d.ts +6 -0
- package/lib/localTeardown.d.ts.map +1 -0
- package/lib/localTeardown.js +28 -0
- package/lib/localTeardown.js.map +1 -0
- package/lib/seUtils.d.ts +127 -0
- package/lib/seUtils.d.ts.map +1 -0
- package/lib/seUtils.js +510 -0
- package/lib/seUtils.js.map +1 -0
- package/package.json +4 -1
- package/.gitlab-ci.yml +0 -20
- package/jest.config.js +0 -11
- package/logo.graffle +0 -0
- package/logo.png +0 -0
- package/src/fiberUtils.ts +0 -60
- package/src/globalSetup.ts +0 -62
- package/src/localSetup.ts +0 -100
- package/src/localTeardown.ts +0 -14
- package/src/seUtils.ts +0 -448
- package/tests/tsconfig.json +0 -7
- package/tsconfig.json +0 -102
- /package/{src → lib}/execScripts/dom.js +0 -0
- /package/{src → lib}/execScripts/fiber.js +0 -0
package/lib/seUtils.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Locator, WebDriver, WebElement } from 'selenium-webdriver';
|
|
2
|
+
export declare function execScript<T>(driver: WebDriver, scriptName: string, fct: string): Promise<T>;
|
|
3
|
+
export interface Bounds {
|
|
4
|
+
top: number;
|
|
5
|
+
left: number;
|
|
6
|
+
bottom: number;
|
|
7
|
+
right: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function boundsToString(bounds: Bounds): string;
|
|
10
|
+
export declare function toFloor(bounds: Bounds[]): Bounds[];
|
|
11
|
+
/**
|
|
12
|
+
* Coordinates are sometimes floats. We compare two numbers with a delta of 1 to ignore rounding problems.
|
|
13
|
+
*/
|
|
14
|
+
export declare function circa(n1: number, n2: number): boolean;
|
|
15
|
+
export declare function waitFor<T>(callback: () => Promise<T>, timeout?: number, intervalTime?: number): Promise<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Takes screenshot of current window and saves it to the given file.
|
|
18
|
+
* The folder is created if it does not yet exists.
|
|
19
|
+
*/
|
|
20
|
+
export declare function saveScreenshot(driver: WebDriver, fileName: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Helper function for printing out an element (tag, id if present)
|
|
23
|
+
*/
|
|
24
|
+
export declare function describe(we: WebElement): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the element by means of `WebElement` by its id attribute.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getElementById(driver: WebDriver, id: string): Promise<WebElement>;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the first element by means of `WebElement` by its class attribute.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getElementByClass(driver: WebDriver, clazz: string): Promise<WebElement>;
|
|
33
|
+
/**
|
|
34
|
+
* Gets the first element by means of `WebElement` by its tag name.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getElementByTag(driver: WebDriver, tagName: string): Promise<WebElement>;
|
|
37
|
+
/**
|
|
38
|
+
* Returns first element containing given text or undefined.
|
|
39
|
+
*
|
|
40
|
+
* Test in browser console: `$x("//*[contains(text(), 'Hello')]")`
|
|
41
|
+
*/
|
|
42
|
+
export declare function getElementContainingText(driver: WebDriver, text: string): Promise<WebElement | undefined>;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the bounding client rect (the bounding box relative to the viewport)
|
|
45
|
+
* of an element (found by its is attribute) by means of a JavaScript call.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getBoundingClientRect(driver: WebDriver, id: string): Promise<DOMRect>;
|
|
48
|
+
/**
|
|
49
|
+
* Returns all {@link getBoundingClientRect} values of the elements
|
|
50
|
+
* found in the given element list.
|
|
51
|
+
* The element list is computed by means of JavaScript code,
|
|
52
|
+
* e.g. `document.getElementsByClassName('grid').item(0).children`.
|
|
53
|
+
*
|
|
54
|
+
* @param elementList JavaScript code to determine the element list
|
|
55
|
+
*/
|
|
56
|
+
export declare function getBoundingClientRects(driver: WebDriver, jsElementList: string): Promise<DOMRect[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Returns the rects using the driver API.
|
|
59
|
+
*/
|
|
60
|
+
export declare function getRects(driver: WebDriver, locator: Locator): Promise<Bounds[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Returns the rects of the first child (of each found element) using the driver API.
|
|
63
|
+
*/
|
|
64
|
+
export declare function getRectsOfContent(driver: WebDriver, locator: Locator): Promise<Bounds[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Returns all text content of the elements
|
|
67
|
+
* found in the given element list.
|
|
68
|
+
* The elements list is computed by means of JavaScript code,
|
|
69
|
+
* e.g. `document.getElementsByClassName('grid').item(0).children`.
|
|
70
|
+
*
|
|
71
|
+
* This is useful in combination with {@link getBoundingClientRects} in
|
|
72
|
+
* order to describe the items.
|
|
73
|
+
*
|
|
74
|
+
* @param elementList JavaScript code to determine the element list
|
|
75
|
+
*/
|
|
76
|
+
export declare function getTextContents(driver: WebDriver, jsElementList: string): Promise<string[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Returns all computed styles of the elements
|
|
79
|
+
* found in the given element list.
|
|
80
|
+
* The elements list is computed by means of JavaScript code,
|
|
81
|
+
* e.g. `document.getElementsByClassName('grid').item(0).children`.
|
|
82
|
+
*
|
|
83
|
+
* @param elementList JavaScript code to determine the element list
|
|
84
|
+
*/
|
|
85
|
+
export declare function getComputedStyles(driver: WebDriver, jsElementList: string, style: string): Promise<string[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Returns the inner size of the windows bounding client rect (the bounding box relative to the viewport)
|
|
88
|
+
* of an element (found by its is attribute) by means of a JavaScript call.
|
|
89
|
+
* The window size contains the scrollbars. I.e. it is a bit larger than {@link getViewPortSize}.
|
|
90
|
+
*/
|
|
91
|
+
export declare function getInnerSizeOfWindow(driver: WebDriver): Promise<{
|
|
92
|
+
width: number;
|
|
93
|
+
height: number;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Returns the viewport size, which is the inner window size but not with the scrollbars.
|
|
97
|
+
* I.e. the viewport size is a bit smaller than {@link getInnerSizeOfWindow} (if scrollbars are visible).
|
|
98
|
+
* The value is retrieved by means of JavaScript.
|
|
99
|
+
*/
|
|
100
|
+
export declare function getViewPortSize(driver: WebDriver): Promise<{
|
|
101
|
+
width: number;
|
|
102
|
+
height: number;
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Returns true if the element identified by its id attribute is with the view port.
|
|
106
|
+
* That does not necessarily means that it is visible, since its display or visible attribute may
|
|
107
|
+
* hide the element.
|
|
108
|
+
*/
|
|
109
|
+
export declare function isInViewPort(driver: WebDriver, id: string): Promise<boolean>;
|
|
110
|
+
/**
|
|
111
|
+
* Sets the window so that the {@link getViewPortSize} matches the given width and height.
|
|
112
|
+
*/
|
|
113
|
+
export declare function setBrowserWindowSize(driver: WebDriver, width: number, height: number): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Sets the window so that the {@link getViewPortSize} matches the given width and height. Warning: This does not work reliably.
|
|
116
|
+
*/
|
|
117
|
+
export declare function setViewPortSize(driver: WebDriver, width: number, height: number): Promise<void>;
|
|
118
|
+
export declare function getInheritedBackgroundColorsByJS(driver: WebDriver, nodelist: string): Promise<string[]>;
|
|
119
|
+
export declare function getInheritedColorsByJS(driver: WebDriver, nodelist: string): Promise<string[]>;
|
|
120
|
+
export declare function getAllTextNodes(driver: WebDriver): Promise<{
|
|
121
|
+
text: string;
|
|
122
|
+
color: string;
|
|
123
|
+
background: string;
|
|
124
|
+
line: string;
|
|
125
|
+
}[]>;
|
|
126
|
+
export declare function getButtonsAndHRefs(driver: WebDriver): Promise<WebElement[]>;
|
|
127
|
+
//# sourceMappingURL=seUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seUtils.d.ts","sourceRoot":"","sources":["../src/seUtils.ts"],"names":[],"mappings":"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"}
|
package/lib/seUtils.js
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.getButtonsAndHRefs = exports.getAllTextNodes = exports.getInheritedColorsByJS = exports.getInheritedBackgroundColorsByJS = exports.setViewPortSize = exports.setBrowserWindowSize = exports.isInViewPort = exports.getViewPortSize = exports.getInnerSizeOfWindow = exports.getComputedStyles = exports.getTextContents = exports.getRectsOfContent = exports.getRects = exports.getBoundingClientRects = exports.getBoundingClientRect = exports.getElementContainingText = exports.getElementByTag = exports.getElementByClass = exports.getElementById = exports.describe = exports.saveScreenshot = exports.waitFor = exports.circa = exports.toFloor = exports.boundsToString = exports.execScript = void 0;
|
|
39
|
+
/**
|
|
40
|
+
* (C) Jens von Pilgrim, 2022
|
|
41
|
+
*/
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const fsPromises = __importStar(require("fs/promises"));
|
|
44
|
+
const path_1 = __importDefault(require("path"));
|
|
45
|
+
const selenium_webdriver_1 = require("selenium-webdriver");
|
|
46
|
+
function execScript(driver, scriptName, fct) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
const scriptPath = path_1.default.join(path_1.default.dirname(__filename), scriptName);
|
|
49
|
+
const script = fs.readFileSync(scriptPath, "utf-8");
|
|
50
|
+
const res = yield driver.executeScript(script + `
|
|
51
|
+
return ${fct}();
|
|
52
|
+
`);
|
|
53
|
+
return res;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
exports.execScript = execScript;
|
|
57
|
+
function boundsToString(bounds) {
|
|
58
|
+
return `(${bounds.left};${bounds.top})x(${bounds.right};${bounds.bottom})`;
|
|
59
|
+
}
|
|
60
|
+
exports.boundsToString = boundsToString;
|
|
61
|
+
function toFloor(bounds) {
|
|
62
|
+
const floors = [];
|
|
63
|
+
for (const b of bounds) {
|
|
64
|
+
floors.push({
|
|
65
|
+
top: Math.floor(b.top),
|
|
66
|
+
bottom: Math.floor(b.bottom),
|
|
67
|
+
left: Math.floor(b.left),
|
|
68
|
+
right: Math.floor(b.right)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return floors;
|
|
72
|
+
}
|
|
73
|
+
exports.toFloor = toFloor;
|
|
74
|
+
/**
|
|
75
|
+
* Coordinates are sometimes floats. We compare two numbers with a delta of 1 to ignore rounding problems.
|
|
76
|
+
*/
|
|
77
|
+
function circa(n1, n2) {
|
|
78
|
+
const delta = n1 - n2;
|
|
79
|
+
return Math.abs(delta) < 1;
|
|
80
|
+
}
|
|
81
|
+
exports.circa = circa;
|
|
82
|
+
function waitFor(callback, timeout = 1000, intervalTime = 100) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
// try first time
|
|
85
|
+
const start = new Date().getTime();
|
|
86
|
+
try {
|
|
87
|
+
const result = yield callback();
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// ignore error
|
|
92
|
+
}
|
|
93
|
+
// if error, try until timeout ms have passed
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
const interval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
try {
|
|
97
|
+
const result = yield callback();
|
|
98
|
+
clearInterval(interval);
|
|
99
|
+
resolve(result);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const duration = new Date().getTime() - start;
|
|
103
|
+
if (duration > timeout) {
|
|
104
|
+
clearInterval(interval);
|
|
105
|
+
reject(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}), intervalTime);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
exports.waitFor = waitFor;
|
|
113
|
+
/**
|
|
114
|
+
* Takes screenshot of current window and saves it to the given file.
|
|
115
|
+
* The folder is created if it does not yet exists.
|
|
116
|
+
*/
|
|
117
|
+
function saveScreenshot(driver, fileName) {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
const pngBase64 = yield driver.takeScreenshot();
|
|
120
|
+
const dirName = path_1.default.dirname(fileName);
|
|
121
|
+
if (!fs.existsSync(dirName)) {
|
|
122
|
+
yield fsPromises.mkdir(dirName, { recursive: true });
|
|
123
|
+
}
|
|
124
|
+
yield fsPromises.writeFile(fileName, pngBase64, 'base64');
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
exports.saveScreenshot = saveScreenshot;
|
|
128
|
+
/**
|
|
129
|
+
* Helper function for printing out an element (tag, id if present)
|
|
130
|
+
*/
|
|
131
|
+
function describe(we) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
let s = yield we.getTagName();
|
|
134
|
+
const id = yield we.getAttribute("id");
|
|
135
|
+
if (id) {
|
|
136
|
+
s += "#" + id;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const clazz = yield we.getAttribute("class");
|
|
140
|
+
if (clazz) {
|
|
141
|
+
s += "." + clazz;
|
|
142
|
+
}
|
|
143
|
+
let text = yield we.getText();
|
|
144
|
+
s += ` ("${text.substring(0, 7)}${text.length > 7 ? '…' : ''})"`;
|
|
145
|
+
}
|
|
146
|
+
return s;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
exports.describe = describe;
|
|
150
|
+
/**
|
|
151
|
+
* Gets the element by means of `WebElement` by its id attribute.
|
|
152
|
+
*/
|
|
153
|
+
function getElementById(driver, id) {
|
|
154
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
155
|
+
const el = yield driver.findElement(selenium_webdriver_1.By.id(id));
|
|
156
|
+
return el;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
exports.getElementById = getElementById;
|
|
160
|
+
/**
|
|
161
|
+
* Gets the first element by means of `WebElement` by its class attribute.
|
|
162
|
+
*/
|
|
163
|
+
function getElementByClass(driver, clazz) {
|
|
164
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
165
|
+
const el = yield driver.findElement(selenium_webdriver_1.By.className(clazz));
|
|
166
|
+
return el;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
exports.getElementByClass = getElementByClass;
|
|
170
|
+
/**
|
|
171
|
+
* Gets the first element by means of `WebElement` by its tag name.
|
|
172
|
+
*/
|
|
173
|
+
function getElementByTag(driver, tagName) {
|
|
174
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
+
const el = yield driver.findElement(selenium_webdriver_1.By.css(tagName));
|
|
176
|
+
return el;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
exports.getElementByTag = getElementByTag;
|
|
180
|
+
/**
|
|
181
|
+
* Returns first element containing given text or undefined.
|
|
182
|
+
*
|
|
183
|
+
* Test in browser console: `$x("//*[contains(text(), 'Hello')]")`
|
|
184
|
+
*/
|
|
185
|
+
function getElementContainingText(driver, text) {
|
|
186
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
try {
|
|
188
|
+
// cf. https://stackoverflow.com/questions/3655549/xpath-containstext-some-string-doesnt-work-when-used-with-node-with-more
|
|
189
|
+
//const el = await driver.findElement(By.xpath(`//*[contains(text(), "${text}")]`));
|
|
190
|
+
const el = yield driver.findElement(selenium_webdriver_1.By.xpath(`//*[text()[contains(., '${text}')]]`));
|
|
191
|
+
return el;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
exports.getElementContainingText = getElementContainingText;
|
|
199
|
+
/**
|
|
200
|
+
* Returns the bounding client rect (the bounding box relative to the viewport)
|
|
201
|
+
* of an element (found by its is attribute) by means of a JavaScript call.
|
|
202
|
+
*/
|
|
203
|
+
function getBoundingClientRect(driver, id) {
|
|
204
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
+
const bcr = yield driver.executeScript('return document.getElementById("' + id + '").getBoundingClientRect()');
|
|
206
|
+
return bcr;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
exports.getBoundingClientRect = getBoundingClientRect;
|
|
210
|
+
/**
|
|
211
|
+
* Returns all {@link getBoundingClientRect} values of the elements
|
|
212
|
+
* found in the given element list.
|
|
213
|
+
* The element list is computed by means of JavaScript code,
|
|
214
|
+
* e.g. `document.getElementsByClassName('grid').item(0).children`.
|
|
215
|
+
*
|
|
216
|
+
* @param elementList JavaScript code to determine the element list
|
|
217
|
+
*/
|
|
218
|
+
function getBoundingClientRects(driver, jsElementList) {
|
|
219
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
220
|
+
const bcr = yield driver.executeScript(`return (()=>{
|
|
221
|
+
const elements = ${jsElementList};
|
|
222
|
+
const bounds=[];
|
|
223
|
+
for (let el of elements) { bounds.push(el.getBoundingClientRect()) }
|
|
224
|
+
return bounds;
|
|
225
|
+
})()`);
|
|
226
|
+
return bcr;
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
exports.getBoundingClientRects = getBoundingClientRects;
|
|
230
|
+
/**
|
|
231
|
+
* Returns the rects using the driver API.
|
|
232
|
+
*/
|
|
233
|
+
function getRects(driver, locator) {
|
|
234
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
235
|
+
const elements = yield driver.findElements(locator);
|
|
236
|
+
const bounds = [];
|
|
237
|
+
for (const element of elements) {
|
|
238
|
+
const rect = yield element.getRect();
|
|
239
|
+
bounds.push({
|
|
240
|
+
top: rect.x, left: rect.y,
|
|
241
|
+
bottom: rect.x + rect.width, right: rect.y + rect.height
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
return bounds;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
exports.getRects = getRects;
|
|
248
|
+
/**
|
|
249
|
+
* Returns the rects of the first child (of each found element) using the driver API.
|
|
250
|
+
*/
|
|
251
|
+
function getRectsOfContent(driver, locator) {
|
|
252
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
253
|
+
const elements = yield driver.findElements(locator);
|
|
254
|
+
const bounds = [];
|
|
255
|
+
for (const element of elements) {
|
|
256
|
+
const rect = yield element.getRect();
|
|
257
|
+
bounds.push({
|
|
258
|
+
top: rect.x, left: rect.y,
|
|
259
|
+
bottom: rect.x + rect.width, right: rect.y + rect.height
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return bounds;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
exports.getRectsOfContent = getRectsOfContent;
|
|
266
|
+
/**
|
|
267
|
+
* Returns all text content of the elements
|
|
268
|
+
* found in the given element list.
|
|
269
|
+
* The elements list is computed by means of JavaScript code,
|
|
270
|
+
* e.g. `document.getElementsByClassName('grid').item(0).children`.
|
|
271
|
+
*
|
|
272
|
+
* This is useful in combination with {@link getBoundingClientRects} in
|
|
273
|
+
* order to describe the items.
|
|
274
|
+
*
|
|
275
|
+
* @param elementList JavaScript code to determine the element list
|
|
276
|
+
*/
|
|
277
|
+
function getTextContents(driver, jsElementList) {
|
|
278
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
+
const tcs = yield driver.executeScript(`const elements = ${jsElementList};
|
|
280
|
+
const tcs=[];
|
|
281
|
+
for (let el of elements) { tcs.push(el.textContent) }
|
|
282
|
+
return tcs;
|
|
283
|
+
`);
|
|
284
|
+
return tcs;
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
exports.getTextContents = getTextContents;
|
|
288
|
+
/**
|
|
289
|
+
* Returns all computed styles of the elements
|
|
290
|
+
* found in the given element list.
|
|
291
|
+
* The elements list is computed by means of JavaScript code,
|
|
292
|
+
* e.g. `document.getElementsByClassName('grid').item(0).children`.
|
|
293
|
+
*
|
|
294
|
+
* @param elementList JavaScript code to determine the element list
|
|
295
|
+
*/
|
|
296
|
+
function getComputedStyles(driver, jsElementList, style) {
|
|
297
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
298
|
+
const tcs = yield driver.executeScript(`const elements = ${jsElementList};
|
|
299
|
+
const tcs=[];
|
|
300
|
+
for (let el of elements) { tcs.push(getComputedStyle(el).${style}) }
|
|
301
|
+
return tcs;
|
|
302
|
+
`);
|
|
303
|
+
return tcs;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
exports.getComputedStyles = getComputedStyles;
|
|
307
|
+
/**
|
|
308
|
+
* Returns the inner size of the windows bounding client rect (the bounding box relative to the viewport)
|
|
309
|
+
* of an element (found by its is attribute) by means of a JavaScript call.
|
|
310
|
+
* The window size contains the scrollbars. I.e. it is a bit larger than {@link getViewPortSize}.
|
|
311
|
+
*/
|
|
312
|
+
function getInnerSizeOfWindow(driver) {
|
|
313
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
314
|
+
const w = yield driver.executeScript('return window.innerWidth');
|
|
315
|
+
const h = yield driver.executeScript('return window.innerHeight');
|
|
316
|
+
return { width: w, height: h };
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
exports.getInnerSizeOfWindow = getInnerSizeOfWindow;
|
|
320
|
+
/**
|
|
321
|
+
* Returns the viewport size, which is the inner window size but not with the scrollbars.
|
|
322
|
+
* I.e. the viewport size is a bit smaller than {@link getInnerSizeOfWindow} (if scrollbars are visible).
|
|
323
|
+
* The value is retrieved by means of JavaScript.
|
|
324
|
+
*/
|
|
325
|
+
function getViewPortSize(driver) {
|
|
326
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
327
|
+
const [clientWidthOfHTML, clientHeightOfHTML] = yield Promise.all([
|
|
328
|
+
driver.executeScript("return document.documentElement.clientWidth"),
|
|
329
|
+
driver.executeScript("return document.documentElement.clientHeight")
|
|
330
|
+
]);
|
|
331
|
+
return { width: clientWidthOfHTML, height: clientHeightOfHTML };
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
exports.getViewPortSize = getViewPortSize;
|
|
335
|
+
/**
|
|
336
|
+
* Returns true if the element identified by its id attribute is with the view port.
|
|
337
|
+
* That does not necessarily means that it is visible, since its display or visible attribute may
|
|
338
|
+
* hide the element.
|
|
339
|
+
*/
|
|
340
|
+
function isInViewPort(driver, id) {
|
|
341
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
342
|
+
const innerSize = yield getInnerSizeOfWindow(driver);
|
|
343
|
+
const [x, y] = yield Promise.all([
|
|
344
|
+
driver.executeScript('return window.scrollX'),
|
|
345
|
+
driver.executeScript('return window.scrollY')
|
|
346
|
+
]);
|
|
347
|
+
const bounds = yield getBoundingClientRect(driver, id);
|
|
348
|
+
return bounds.x + bounds.width >= x && bounds.y + bounds.height >= y
|
|
349
|
+
&& bounds.x < x + innerSize.width && bounds.y < y + innerSize.height;
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
exports.isInViewPort = isInViewPort;
|
|
353
|
+
/**
|
|
354
|
+
* Sets the window so that the {@link getViewPortSize} matches the given width and height.
|
|
355
|
+
*/
|
|
356
|
+
function setBrowserWindowSize(driver, width, height) {
|
|
357
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
358
|
+
// const rect = await driver.manage().window().getRect();
|
|
359
|
+
yield waitForSetRect(driver, width, height);
|
|
360
|
+
// await driver.manage().window().setRect({ width: width, height: height });
|
|
361
|
+
// return waitFor(async () => {
|
|
362
|
+
// const rectAfter = await driver.manage().window().getRect();
|
|
363
|
+
// if (check && (rectAfter.width != width || rectAfter.height != height)) {
|
|
364
|
+
// throw new Error(`Cannot set window to size (${width}, ${height}). Size is probably too small or too large, got ${rectAfter.width}/${rectAfter.height}, was before ${rect.width}/${rect.height}.`);
|
|
365
|
+
// }
|
|
366
|
+
// });
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
exports.setBrowserWindowSize = setBrowserWindowSize;
|
|
370
|
+
function waitForSetRect(driver, width, height) {
|
|
371
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
372
|
+
const rectBefore = yield driver.manage().window().getRect();
|
|
373
|
+
yield driver.manage().window().setRect({ width: width, height: height });
|
|
374
|
+
return waitFor(() => __awaiter(this, void 0, void 0, function* () {
|
|
375
|
+
const rectAfter = yield driver.manage().window().getRect();
|
|
376
|
+
if (rectAfter.width != width || rectAfter.height != height) {
|
|
377
|
+
throw new Error(`Cannot set window to size (${width}, ${height}). Size is probably too small or too large, got ${rectAfter.width}/${rectAfter.height}, was before ${rectBefore.width}/${rectBefore.height}.`);
|
|
378
|
+
}
|
|
379
|
+
}));
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Sets the window so that the {@link getViewPortSize} matches the given width and height. Warning: This does not work reliably.
|
|
384
|
+
*/
|
|
385
|
+
function setViewPortSize(driver, width, height) {
|
|
386
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
387
|
+
const rect = yield driver.manage().window().getRect();
|
|
388
|
+
const innerBefore = yield getInnerSizeOfWindow(driver);
|
|
389
|
+
const deltaX = rect.width - innerBefore.width;
|
|
390
|
+
const deltaY = rect.height - innerBefore.height;
|
|
391
|
+
yield waitForSetRect(driver, width + deltaX, height + deltaY);
|
|
392
|
+
const [innerAfter, viewport] = yield Promise.all([getInnerSizeOfWindow(driver), getViewPortSize(driver)]);
|
|
393
|
+
// adjust scrollbars if necessary
|
|
394
|
+
const sbHeight = innerAfter.height - viewport.height;
|
|
395
|
+
const sbWidth = innerAfter.width - viewport.width;
|
|
396
|
+
yield waitForSetRect(driver, width + deltaX + sbWidth, height + deltaY + sbHeight);
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
exports.setViewPortSize = setViewPortSize;
|
|
400
|
+
function getInheritedBackgroundColorsByJS(driver, nodelist) {
|
|
401
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
402
|
+
const colors = yield driver.executeScript(`
|
|
403
|
+
const list = ${nodelist};
|
|
404
|
+
function getDefaultBackground() {
|
|
405
|
+
var div = document.createElement("div")
|
|
406
|
+
document.head.appendChild(div)
|
|
407
|
+
var bg = getComputedStyle(div).backgroundColor
|
|
408
|
+
document.head.removeChild(div)
|
|
409
|
+
return bg
|
|
410
|
+
}
|
|
411
|
+
const defaultStyle = getDefaultBackground()
|
|
412
|
+
function getInheritedBackgroundColor(el) {
|
|
413
|
+
var backgroundColor = getComputedStyle(el).backgroundColor
|
|
414
|
+
if (backgroundColor != defaultStyle) return backgroundColor
|
|
415
|
+
if (!el.parentElement) return defaultStyle
|
|
416
|
+
return getInheritedBackgroundColor(el.parentElement)
|
|
417
|
+
}
|
|
418
|
+
const colors = []
|
|
419
|
+
for (let e of list) {
|
|
420
|
+
colors.push(getInheritedBackgroundColor(e));
|
|
421
|
+
}
|
|
422
|
+
return colors;
|
|
423
|
+
`);
|
|
424
|
+
return colors;
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
exports.getInheritedBackgroundColorsByJS = getInheritedBackgroundColorsByJS;
|
|
428
|
+
function getInheritedColorsByJS(driver, nodelist) {
|
|
429
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
430
|
+
const colors = yield driver.executeScript(`
|
|
431
|
+
const list = ${nodelist};
|
|
432
|
+
function getDefaultColor() {
|
|
433
|
+
var div = document.createElement("div")
|
|
434
|
+
document.head.appendChild(div)
|
|
435
|
+
var bg = getComputedStyle(div).color
|
|
436
|
+
document.head.removeChild(div)
|
|
437
|
+
return bg
|
|
438
|
+
}
|
|
439
|
+
const defaultStyle = getDefaultColor()
|
|
440
|
+
function getInheritedColor(el) {
|
|
441
|
+
var color = getComputedStyle(el).color
|
|
442
|
+
if (color != defaultStyle) return color
|
|
443
|
+
if (!el.parentElement) return defaultStyle
|
|
444
|
+
return getInheritedColor(el.parentElement)
|
|
445
|
+
}
|
|
446
|
+
const colors = []
|
|
447
|
+
for (let e of list) {
|
|
448
|
+
colors.push(getInheritedColor(e));
|
|
449
|
+
}
|
|
450
|
+
return colors;
|
|
451
|
+
`);
|
|
452
|
+
return colors;
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
exports.getInheritedColorsByJS = getInheritedColorsByJS;
|
|
456
|
+
function rgb2hex(rgba) {
|
|
457
|
+
return "#" +
|
|
458
|
+
rgba.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+\.{0,1}\d*))?\)$/)
|
|
459
|
+
.slice(1)
|
|
460
|
+
.map((n, i) => (i === 3
|
|
461
|
+
? Math.round(parseFloat(n) * 255)
|
|
462
|
+
: parseFloat(n)).toString(16).padStart(2, '0').replace('NaN', ''))
|
|
463
|
+
.join('');
|
|
464
|
+
}
|
|
465
|
+
function getAllTextNodes(driver) {
|
|
466
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
467
|
+
const res = yield driver.executeScript(`
|
|
468
|
+
|
|
469
|
+
const TRANSPARENT = "rgba(0, 0, 0, 0)";
|
|
470
|
+
const all = [];
|
|
471
|
+
const view = document.defaultView;
|
|
472
|
+
function collect(e) {
|
|
473
|
+
const styles = view.getComputedStyle(e);
|
|
474
|
+
const pStyles = view.getComputedStyle(e.parentElement);
|
|
475
|
+
const childNodes = e.childNodes;
|
|
476
|
+
for (let i=0; i<childNodes.length; i++) {
|
|
477
|
+
const node = childNodes.item(i);
|
|
478
|
+
if (node instanceof Element) {
|
|
479
|
+
collect(node);
|
|
480
|
+
} else if (node instanceof Text && node.textContent.trim().length>0) {
|
|
481
|
+
all.push({
|
|
482
|
+
text: node.textContent.trim(),
|
|
483
|
+
color: styles?.color!==TRANSPARENT?styles?.color:pStyles?.color,
|
|
484
|
+
background: styles?.backgroundColor!==TRANSPARENT?styles?.backgroundColor:pStyles?.backgroundColor,
|
|
485
|
+
line: styles?.textDecorationLine==='none'?pStyles?.textDecorationLine:styles?.textDecorationLine
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
collect(document.body);
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
return all;
|
|
494
|
+
`);
|
|
495
|
+
res.forEach(e => {
|
|
496
|
+
e.color = rgb2hex(e.color);
|
|
497
|
+
e.background = rgb2hex(e.background);
|
|
498
|
+
});
|
|
499
|
+
return res;
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
exports.getAllTextNodes = getAllTextNodes;
|
|
503
|
+
function getButtonsAndHRefs(driver) {
|
|
504
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
505
|
+
const elements = yield execScript(driver, "execScripts/dom.js", "getButtonsAndHRefs");
|
|
506
|
+
return elements;
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
exports.getButtonsAndHRefs = getButtonsAndHRefs;
|
|
510
|
+
//# sourceMappingURL=seUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seUtils.js","sourceRoot":"","sources":["../src/seUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sefiutils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Utilities (and Jest tests) for Selenium Webdriver Tests and some React tools as well",
|
|
5
5
|
"author": "Jens von Pilgrim <jens.vonpilgrim@bht-berlin.de>",
|
|
6
6
|
"license": "EPL-2.0",
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "https://gitlab.bht-berlin.de/nodepackages/sefiutils.git"
|
|
11
11
|
},
|
|
12
|
+
"files": [
|
|
13
|
+
"lib/"
|
|
14
|
+
],
|
|
12
15
|
"scripts": {
|
|
13
16
|
"build": "tsc && copyfiles --up 1 -e ./src/**/*.ts ./src/**/*.* lib",
|
|
14
17
|
"clean": "rimraf lib",
|