testeranto 0.114.1 → 0.121.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/README.md +6 -1
- package/bundle.js +1 -1
- package/dist/common/Init.js +55 -61
- package/dist/common/PM/base.js +233 -0
- package/dist/common/PM/main.js +217 -434
- package/dist/common/build.js +113 -92
- package/dist/common/defaultConfig.js +2 -2
- package/dist/common/esbuildConfigs/index.js +1 -1
- package/dist/common/esbuildConfigs/inputFilesPlugin.js +7 -3
- package/dist/common/esbuildConfigs/node.js +5 -3
- package/dist/common/esbuildConfigs/web.js +3 -3
- package/dist/common/init-docs.js +2 -46
- package/dist/common/lib/abstractBase.js +60 -54
- package/dist/common/lib/basebuilder.js +7 -8
- package/dist/common/lib/classBuilder.js +8 -5
- package/dist/common/lib/core.js +6 -18
- package/dist/common/lib/index.js +6 -1
- package/dist/common/run.js +10 -2
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/common/utils.js +9 -21
- package/dist/module/Init.js +55 -61
- package/dist/module/PM/base.js +226 -0
- package/dist/module/PM/main.js +218 -435
- package/dist/module/Project.js +117 -0
- package/dist/module/TestReport.js +13 -4
- package/dist/module/build.js +113 -92
- package/dist/module/defaultConfig.js +2 -2
- package/dist/module/esbuildConfigs/index.js +1 -1
- package/dist/module/esbuildConfigs/inputFilesPlugin.js +7 -3
- package/dist/module/esbuildConfigs/node.js +5 -3
- package/dist/module/esbuildConfigs/web.js +3 -3
- package/dist/module/init-docs.js +2 -13
- package/dist/module/lib/abstractBase.js +60 -54
- package/dist/module/lib/basebuilder.js +7 -8
- package/dist/module/lib/classBuilder.js +8 -5
- package/dist/module/lib/core.js +6 -18
- package/dist/module/lib/index.js +6 -1
- package/dist/module/run.js +10 -2
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/module/utils.js +8 -17
- package/dist/prebuild/Project.css +11367 -0
- package/dist/prebuild/Project.js +24640 -0
- package/dist/prebuild/ReportClient.js +1 -1
- package/dist/prebuild/TestReport.js +9 -11
- package/dist/prebuild/build.mjs +142 -81
- package/dist/prebuild/init-docs.mjs +28 -83
- package/dist/prebuild/run.mjs +618 -537
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/Init.d.ts +1 -1
- package/dist/types/PM/base.d.ts +38 -0
- package/dist/types/PM/main.d.ts +20 -44
- package/dist/types/esbuildConfigs/inputFilesPlugin.d.ts +1 -1
- package/dist/types/esbuildConfigs/node.d.ts +1 -1
- package/dist/types/esbuildConfigs/web.d.ts +1 -1
- package/dist/types/lib/abstractBase.d.ts +19 -11
- package/dist/types/lib/basebuilder.d.ts +1 -2
- package/dist/types/lib/index.d.ts +3 -3
- package/dist/types/lib/types.d.ts +2 -5
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/utils.d.ts +4 -7
- package/package.json +6 -5
- package/src/Init.ts +60 -68
- package/src/PM/base.ts +301 -0
- package/src/PM/main.ts +276 -567
- package/src/Project.tsx +197 -0
- package/src/ReportClient.tsx +1 -1
- package/src/TestReport.tsx +30 -15
- package/src/build.ts +140 -104
- package/src/defaultConfig.ts +2 -2
- package/src/esbuildConfigs/index.ts +1 -1
- package/src/esbuildConfigs/inputFilesPlugin.ts +7 -6
- package/src/esbuildConfigs/node.ts +5 -3
- package/src/esbuildConfigs/web.ts +4 -3
- package/src/init-docs.ts +2 -15
- package/src/lib/abstractBase.ts +113 -93
- package/src/lib/basebuilder.ts +8 -9
- package/src/lib/classBuilder.ts +11 -10
- package/src/lib/core.ts +15 -27
- package/src/lib/index.ts +13 -6
- package/src/lib/types.ts +3 -8
- package/src/run.ts +21 -5
- package/src/utils.ts +27 -39
- package/tsc.log +12 -23
- package/dist/common/puppeteerConfiger.js +0 -24
- package/dist/module/puppeteerConfiger.js +0 -19
- package/dist/types/puppeteerConfiger.d.ts +0 -4
- package/src/puppeteerConfiger.ts +0 -26
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ npm: [npmjs.com/package/testeranto](https://www.npmjs.com/package/testeranto)
|
|
|
12
12
|
|
|
13
13
|
dev: [github.dev/adamwong246/testeranto](https://github.dev/adamwong246/testeranto)
|
|
14
14
|
|
|
15
|
-
example test report: [chromapdx.github.io/kokomoBay](https://chromapdx.github.io/kokomoBay/
|
|
15
|
+
example test report: [chromapdx.github.io/kokomoBay](https://chromapdx.github.io/kokomoBay/testeranto/index.html)
|
|
16
16
|
|
|
17
17
|
example repo: [kokomo bay](https://github.com/ChromaPDX/kokomoBay)
|
|
18
18
|
|
|
@@ -22,6 +22,7 @@ example repo: [kokomo bay](https://github.com/ChromaPDX/kokomoBay)
|
|
|
22
22
|
- Testeranto tests are specified in a strongly-typed gherkin-like syntax. Rather than testing your code directly, Testeranto requires you wrap your code with a semantic interface which is based on TS type signatures.
|
|
23
23
|
- Testeranto can be run in the frontend or the backend, or both.
|
|
24
24
|
- Testeranto can be used to test anything that can be bundled with esbuild.
|
|
25
|
+
- Testeranto is _reasonably_ efficient. It is less performant than other similar js testing libraries.
|
|
25
26
|
|
|
26
27
|
## tech of note
|
|
27
28
|
|
|
@@ -30,3 +31,7 @@ example repo: [kokomo bay](https://github.com/ChromaPDX/kokomoBay)
|
|
|
30
31
|
- puppeteer - provides access to both node and chrome runtimes
|
|
31
32
|
- esbuild - used to quickly generate test bundles
|
|
32
33
|
- aider - AI to automatically fix broken tests
|
|
34
|
+
|
|
35
|
+
## Do's and Don't
|
|
36
|
+
|
|
37
|
+
When writing your test, be careful when using platform specific features, like "fs" on node, or "window" in the browser. If you need to write to a file, or to log information, use the `utils`. Instead of platform specific libraries, like node's "assert", use a cross-platform alternative like "chai".
|
package/bundle.js
CHANGED
|
@@ -92,7 +92,7 @@ await esbuild.build({
|
|
|
92
92
|
/////////////////////////
|
|
93
93
|
|
|
94
94
|
await esbuild.build({
|
|
95
|
-
entryPoints: ['src/ReportClient.tsx', 'src/TestReport.tsx'],
|
|
95
|
+
entryPoints: ['src/ReportClient.tsx', 'src/TestReport.tsx', 'src/Project.tsx'],
|
|
96
96
|
bundle: true,
|
|
97
97
|
format: "iife",
|
|
98
98
|
platform: "browser",
|
package/dist/common/Init.js
CHANGED
|
@@ -4,65 +4,59 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const fs_1 = __importDefault(require("fs"));
|
|
7
|
-
exports.default = async (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
fs_1.default.mkdirSync(`${process.cwd()}/${config.outdir}/ts`);
|
|
64
|
-
}
|
|
65
|
-
catch (_e) {
|
|
66
|
-
// console.log()
|
|
67
|
-
}
|
|
7
|
+
exports.default = async () => {
|
|
8
|
+
[
|
|
9
|
+
`testeranto/`,
|
|
10
|
+
`testeranto/bundles/`,
|
|
11
|
+
`testeranto/bundles/node`,
|
|
12
|
+
`testeranto/bundles/web`,
|
|
13
|
+
`testeranto/reports`,
|
|
14
|
+
`testeranto/reports/`,
|
|
15
|
+
`testeranto/features/`,
|
|
16
|
+
].forEach((f) => {
|
|
17
|
+
try {
|
|
18
|
+
fs_1.default.mkdirSync(`${process.cwd()}/${f}`);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
// console.error(e);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
// fs.writeFileSync(
|
|
25
|
+
// `${process.cwd()}/testeranto/index.html`,
|
|
26
|
+
// `
|
|
27
|
+
// <!DOCTYPE html>
|
|
28
|
+
// <html lang="en">
|
|
29
|
+
// <head>
|
|
30
|
+
// <meta name="description" content="Webpage description goes here" />
|
|
31
|
+
// <meta charset="utf-8" />
|
|
32
|
+
// <title>kokomoBay - testeranto</title>
|
|
33
|
+
// <meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
34
|
+
// <meta name="author" content="" />
|
|
35
|
+
// <script type="module" src="/kokomoBay/testeranto/Project.js"></script>
|
|
36
|
+
// </head>
|
|
37
|
+
// <body>
|
|
38
|
+
// <div id="root">
|
|
39
|
+
// react is loading
|
|
40
|
+
// </div>
|
|
41
|
+
// </body>
|
|
42
|
+
// </html>
|
|
43
|
+
// `
|
|
44
|
+
// );
|
|
45
|
+
fs_1.default.copyFileSync(`node_modules/testeranto/dist/prebuild/Project.js`, `testeranto/Project.js`);
|
|
46
|
+
fs_1.default.copyFileSync(`node_modules/testeranto/dist/prebuild/ReportClient.js`, `testeranto/ReportClient.js`);
|
|
47
|
+
fs_1.default.copyFileSync(`node_modules/testeranto/dist/prebuild/Project.css`, `testeranto/Project.css`);
|
|
48
|
+
fs_1.default.copyFileSync(`node_modules/testeranto/dist/prebuild/ReportClient.css`, `testeranto/ReportClient.css`);
|
|
49
|
+
fs_1.default.copyFileSync(`node_modules/testeranto/dist/prebuild/TestReport.js`, `testeranto/TestReport.js`);
|
|
50
|
+
fs_1.default.copyFileSync(`node_modules/testeranto/dist/prebuild/TestReport.css`, `testeranto/TestReport.css`);
|
|
51
|
+
// fs.writeFileSync(
|
|
52
|
+
// `${config.outdir}/testeranto.json`,
|
|
53
|
+
// JSON.stringify(
|
|
54
|
+
// {
|
|
55
|
+
// ...config,
|
|
56
|
+
// buildDir: process.cwd() + "/" + config.outdir,
|
|
57
|
+
// },
|
|
58
|
+
// null,
|
|
59
|
+
// 2
|
|
60
|
+
// )
|
|
61
|
+
// );
|
|
68
62
|
};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PM_Base = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const index_js_1 = require("./index.js");
|
|
10
|
+
const fileStreams3 = [];
|
|
11
|
+
const fPaths = [];
|
|
12
|
+
const files = {};
|
|
13
|
+
const recorders = {};
|
|
14
|
+
const screenshots = {};
|
|
15
|
+
class PM_Base extends index_js_1.PM {
|
|
16
|
+
constructor(configs) {
|
|
17
|
+
super();
|
|
18
|
+
this.server = {};
|
|
19
|
+
this.configs = configs;
|
|
20
|
+
globalThis["waitForSelector"] = async (pageKey, sel) => {
|
|
21
|
+
const page = (await this.browser.pages()).find(
|
|
22
|
+
/* @ts-ignore:next-line */
|
|
23
|
+
(p) => p.mainFrame()._id === pageKey);
|
|
24
|
+
await (page === null || page === void 0 ? void 0 : page.waitForSelector(sel));
|
|
25
|
+
};
|
|
26
|
+
globalThis["screencastStop"] = async (path) => {
|
|
27
|
+
return recorders[path].stop();
|
|
28
|
+
};
|
|
29
|
+
globalThis["closePage"] = async (pageKey) => {
|
|
30
|
+
const page = (await this.browser.pages()).find(
|
|
31
|
+
/* @ts-ignore:next-line */
|
|
32
|
+
(p) => p.mainFrame()._id === pageKey);
|
|
33
|
+
/* @ts-ignore:next-line */
|
|
34
|
+
return page.close();
|
|
35
|
+
};
|
|
36
|
+
globalThis["goto"] = async (pageKey, url) => {
|
|
37
|
+
const page = (await this.browser.pages()).find(
|
|
38
|
+
/* @ts-ignore:next-line */
|
|
39
|
+
(p) => p.mainFrame()._id === pageKey);
|
|
40
|
+
await (page === null || page === void 0 ? void 0 : page.goto(url));
|
|
41
|
+
return;
|
|
42
|
+
};
|
|
43
|
+
globalThis["newPage"] = () => {
|
|
44
|
+
return this.browser.newPage();
|
|
45
|
+
};
|
|
46
|
+
globalThis["pages"] = () => {
|
|
47
|
+
return this.browser.pages();
|
|
48
|
+
};
|
|
49
|
+
globalThis["mkdirSync"] = (fp) => {
|
|
50
|
+
if (!fs_1.default.existsSync(fp)) {
|
|
51
|
+
return fs_1.default.mkdirSync(fp, {
|
|
52
|
+
recursive: true,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
};
|
|
57
|
+
globalThis["writeFileSync"] = (filepath, contents, testName) => {
|
|
58
|
+
fs_1.default.mkdirSync(path_1.default.dirname(filepath), {
|
|
59
|
+
recursive: true,
|
|
60
|
+
});
|
|
61
|
+
if (!files[testName]) {
|
|
62
|
+
files[testName] = new Set();
|
|
63
|
+
}
|
|
64
|
+
files[testName].add(filepath);
|
|
65
|
+
return fs_1.default.writeFileSync(filepath, contents);
|
|
66
|
+
};
|
|
67
|
+
globalThis["createWriteStream"] = (filepath, testName) => {
|
|
68
|
+
const f = fs_1.default.createWriteStream(filepath);
|
|
69
|
+
fileStreams3.push(f);
|
|
70
|
+
// files.add(filepath);
|
|
71
|
+
if (!files[testName]) {
|
|
72
|
+
files[testName] = new Set();
|
|
73
|
+
}
|
|
74
|
+
files[testName].add(filepath);
|
|
75
|
+
return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams3.length - 1 });
|
|
76
|
+
};
|
|
77
|
+
globalThis["write"] = (uid, contents) => {
|
|
78
|
+
fileStreams3[uid].write(contents);
|
|
79
|
+
};
|
|
80
|
+
globalThis["end"] = (uid) => {
|
|
81
|
+
fileStreams3[uid].end();
|
|
82
|
+
};
|
|
83
|
+
globalThis["customScreenShot"] = async (opts, pageKey, testName) => {
|
|
84
|
+
const page = (await this.browser.pages()).find(
|
|
85
|
+
/* @ts-ignore:next-line */
|
|
86
|
+
(p) => p.mainFrame()._id === pageKey);
|
|
87
|
+
const p = opts.path;
|
|
88
|
+
const dir = path_1.default.dirname(p);
|
|
89
|
+
fs_1.default.mkdirSync(dir, {
|
|
90
|
+
recursive: true,
|
|
91
|
+
});
|
|
92
|
+
if (!files[opts.path]) {
|
|
93
|
+
files[opts.path] = new Set();
|
|
94
|
+
}
|
|
95
|
+
files[opts.path].add(opts.path);
|
|
96
|
+
/* @ts-ignore:next-line */
|
|
97
|
+
const sPromise = page.screenshot(Object.assign(Object.assign({}, opts), { path: p }));
|
|
98
|
+
if (!screenshots[opts.path]) {
|
|
99
|
+
screenshots[opts.path] = [];
|
|
100
|
+
}
|
|
101
|
+
screenshots[opts.path].push(sPromise);
|
|
102
|
+
await sPromise;
|
|
103
|
+
return sPromise;
|
|
104
|
+
};
|
|
105
|
+
globalThis["screencast"] = async (opts, pageKey) => {
|
|
106
|
+
const page = (await this.browser.pages()).find(
|
|
107
|
+
/* @ts-ignore:next-line */
|
|
108
|
+
(p) => p.mainFrame()._id === pageKey);
|
|
109
|
+
const p = opts.path;
|
|
110
|
+
const dir = path_1.default.dirname(p);
|
|
111
|
+
fs_1.default.mkdirSync(dir, {
|
|
112
|
+
recursive: true,
|
|
113
|
+
});
|
|
114
|
+
const recorder = await (page === null || page === void 0 ? void 0 : page.screencast(Object.assign(Object.assign({}, opts), {
|
|
115
|
+
/* @ts-ignore:next-line */
|
|
116
|
+
path: p })));
|
|
117
|
+
/* @ts-ignore:next-line */
|
|
118
|
+
recorders[opts.path] = recorder;
|
|
119
|
+
return opts.path;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
customclose() {
|
|
123
|
+
throw new Error("Method not implemented.");
|
|
124
|
+
}
|
|
125
|
+
waitForSelector(p, s) {
|
|
126
|
+
throw new Error("Method not implemented.");
|
|
127
|
+
}
|
|
128
|
+
closePage(p) {
|
|
129
|
+
throw new Error("Method not implemented.");
|
|
130
|
+
}
|
|
131
|
+
newPage() {
|
|
132
|
+
throw new Error("Method not implemented.");
|
|
133
|
+
}
|
|
134
|
+
goto(p, url) {
|
|
135
|
+
throw new Error("Method not implemented.");
|
|
136
|
+
}
|
|
137
|
+
$(selector) {
|
|
138
|
+
throw new Error("Method not implemented.");
|
|
139
|
+
}
|
|
140
|
+
screencast(opts) {
|
|
141
|
+
throw new Error("Method not implemented.");
|
|
142
|
+
}
|
|
143
|
+
/* @ts-ignore:next-line */
|
|
144
|
+
customScreenShot(opts, cdpPage) {
|
|
145
|
+
throw new Error("Method not implemented.");
|
|
146
|
+
}
|
|
147
|
+
end(accessObject) {
|
|
148
|
+
throw new Error("Method not implemented.");
|
|
149
|
+
}
|
|
150
|
+
existsSync(destFolder) {
|
|
151
|
+
return fs_1.default.existsSync(destFolder);
|
|
152
|
+
}
|
|
153
|
+
async mkdirSync(fp) {
|
|
154
|
+
if (!fs_1.default.existsSync(fp)) {
|
|
155
|
+
return fs_1.default.mkdirSync(fp, {
|
|
156
|
+
recursive: true,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
writeFileSync(fp, contents) {
|
|
162
|
+
fs_1.default.writeFileSync(fp, contents);
|
|
163
|
+
}
|
|
164
|
+
createWriteStream(filepath) {
|
|
165
|
+
return fs_1.default.createWriteStream(filepath);
|
|
166
|
+
}
|
|
167
|
+
testArtiFactoryfileWriter(tLog, callback) {
|
|
168
|
+
return (fPath, value) => {
|
|
169
|
+
callback(new Promise((res, rej) => {
|
|
170
|
+
tLog("testArtiFactory =>", fPath);
|
|
171
|
+
const cleanPath = path_1.default.resolve(fPath);
|
|
172
|
+
fPaths.push(cleanPath.replace(process.cwd(), ``));
|
|
173
|
+
const targetDir = cleanPath.split("/").slice(0, -1).join("/");
|
|
174
|
+
fs_1.default.mkdir(targetDir, { recursive: true }, async (error) => {
|
|
175
|
+
if (error) {
|
|
176
|
+
console.error(`❗️testArtiFactory failed`, targetDir, error);
|
|
177
|
+
}
|
|
178
|
+
fs_1.default.writeFileSync(path_1.default.resolve(targetDir.split("/").slice(0, -1).join("/"), "manifest"), fPaths.join(`\n`), {
|
|
179
|
+
encoding: "utf-8",
|
|
180
|
+
});
|
|
181
|
+
if (Buffer.isBuffer(value)) {
|
|
182
|
+
fs_1.default.writeFileSync(fPath, value, "binary");
|
|
183
|
+
res();
|
|
184
|
+
}
|
|
185
|
+
else if (`string` === typeof value) {
|
|
186
|
+
fs_1.default.writeFileSync(fPath, value.toString(), {
|
|
187
|
+
encoding: "utf-8",
|
|
188
|
+
});
|
|
189
|
+
res();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
/* @ts-ignore:next-line */
|
|
193
|
+
const pipeStream = value;
|
|
194
|
+
const myFile = fs_1.default.createWriteStream(fPath);
|
|
195
|
+
pipeStream.pipe(myFile);
|
|
196
|
+
pipeStream.on("close", () => {
|
|
197
|
+
myFile.close();
|
|
198
|
+
res();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}));
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
write(accessObject, contents) {
|
|
206
|
+
throw new Error("Method not implemented.");
|
|
207
|
+
}
|
|
208
|
+
page() {
|
|
209
|
+
throw new Error("Method not implemented.");
|
|
210
|
+
}
|
|
211
|
+
click(selector) {
|
|
212
|
+
throw new Error("Method not implemented.");
|
|
213
|
+
}
|
|
214
|
+
focusOn(selector) {
|
|
215
|
+
throw new Error("Method not implemented.");
|
|
216
|
+
}
|
|
217
|
+
typeInto(value) {
|
|
218
|
+
throw new Error("Method not implemented.");
|
|
219
|
+
}
|
|
220
|
+
getValue(value) {
|
|
221
|
+
throw new Error("Method not implemented.");
|
|
222
|
+
}
|
|
223
|
+
getAttribute(selector, attribute) {
|
|
224
|
+
throw new Error("Method not implemented.");
|
|
225
|
+
}
|
|
226
|
+
isDisabled(selector) {
|
|
227
|
+
throw new Error("Method not implemented.");
|
|
228
|
+
}
|
|
229
|
+
screencastStop(s) {
|
|
230
|
+
throw new Error("Method not implemented.");
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.PM_Base = PM_Base;
|