@camperaid/watest 2.2.4 → 2.3.3
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/core/base.js +12 -11
- package/core/core.js +10 -9
- package/core/series.js +51 -32
- package/core/spawn.js +4 -2
- package/core/util.js +2 -1
- package/index.js +2 -1
- package/logging/logging.js +27 -0
- package/logging/logpipe.js +6 -5
- package/package.json +2 -2
- package/tests/e2e/samples/folder/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/folder/package-lock.json +1 -2
- package/tests/e2e/samples/loader/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/loader/package-lock.json +1 -2
- package/tests/e2e/samples/loader_mixed/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/loader_mixed/package-lock.json +1 -2
- package/tests/e2e/samples/loader_multiple/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/loader_multiple/package-lock.json +1 -2
- package/tests/e2e/samples/single/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/single/package-lock.json +1 -2
- package/tests/e2e/samples/wd_mixed/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/wd_mixed/package-lock.json +1 -2
- package/tests/e2e/samples/wd_single/node_modules/.package-lock.json +1 -2
- package/tests/e2e/samples/wd_single/package-lock.json +1 -2
- package/tests/series/build/t_expected_failures.js +111 -0
- package/tests/series/perform/t_intermittent_global.js +80 -0
- package/tests/webdriver/t_app_driver.js +45 -13
- package/tests/webdriver/t_attribute.js +1 -0
- package/tests/webdriver/t_attribute_all.js +1 -0
- package/tests/webdriver/t_properties.js +3 -0
- package/tests/webdriver/t_script.js +2 -0
- package/tests/webdriver/t_select_all.js +67 -0
- package/tests/webdriver/t_selection.js +1 -0
- package/tests/webdriver/t_text.js +4 -0
- package/tests/webdriver/t_text_all.js +3 -0
- package/tests/webdriver/test.js +7 -1
- package/webdriver/app_driver.js +3 -21
- package/webdriver/control_driver.js +32 -0
- package/webdriver/driver.js +20 -14
- package/webdriver/driver_base.js +24 -10
- package/webdriver/session.js +9 -12
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { is, MockSeries } = require('../test.js');
|
|
4
|
+
|
|
5
|
+
module.exports.test = async () => {
|
|
6
|
+
const test = got => got.name == 'test_wrap';
|
|
7
|
+
const failures_info = [
|
|
8
|
+
{
|
|
9
|
+
type: 'intermittent',
|
|
10
|
+
group: '*',
|
|
11
|
+
list: ['Server terminates connection'],
|
|
12
|
+
msg: 'Server terminates connection 421 error',
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
const ts = {
|
|
16
|
+
'unit': {
|
|
17
|
+
meta: {
|
|
18
|
+
folders: ['base', 'core'],
|
|
19
|
+
expected_failures: [
|
|
20
|
+
[
|
|
21
|
+
'**',
|
|
22
|
+
[
|
|
23
|
+
[
|
|
24
|
+
'all',
|
|
25
|
+
'intermittent',
|
|
26
|
+
'*',
|
|
27
|
+
[`Server terminates connection`],
|
|
28
|
+
`Server terminates connection 421 error`,
|
|
29
|
+
],
|
|
30
|
+
],
|
|
31
|
+
],
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
'unit/base': {
|
|
36
|
+
meta: {
|
|
37
|
+
folders: ['generic'],
|
|
38
|
+
},
|
|
39
|
+
files: ['t_testo.js'],
|
|
40
|
+
},
|
|
41
|
+
'unit/base/t_testo.js': {
|
|
42
|
+
test() {},
|
|
43
|
+
},
|
|
44
|
+
'unit/base/generic': {
|
|
45
|
+
files: ['t_nahimov.js'],
|
|
46
|
+
},
|
|
47
|
+
'unit/base/generic/t_nahimov.js': {
|
|
48
|
+
test() {},
|
|
49
|
+
},
|
|
50
|
+
'unit/core': {
|
|
51
|
+
files: ['t_presto.js'],
|
|
52
|
+
},
|
|
53
|
+
'unit/core/t_presto.js': {
|
|
54
|
+
test() {},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const series = new MockSeries('', { ts });
|
|
59
|
+
const tests = await series.build({
|
|
60
|
+
patterns: [],
|
|
61
|
+
folder: 'unit',
|
|
62
|
+
virtual_folder: 'unit',
|
|
63
|
+
});
|
|
64
|
+
series.shutdown();
|
|
65
|
+
|
|
66
|
+
is(
|
|
67
|
+
tests,
|
|
68
|
+
[
|
|
69
|
+
{
|
|
70
|
+
name: 'unit/base',
|
|
71
|
+
path: 'unit/base/',
|
|
72
|
+
subtests: [
|
|
73
|
+
{
|
|
74
|
+
name: 'unit/base/t_testo.js',
|
|
75
|
+
path: 'unit/base/t_testo.js',
|
|
76
|
+
func: test,
|
|
77
|
+
failures_info,
|
|
78
|
+
webdriver: '',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'unit/base/generic',
|
|
82
|
+
path: 'unit/base/generic/',
|
|
83
|
+
subtests: [
|
|
84
|
+
{
|
|
85
|
+
name: 'unit/base/generic/t_nahimov.js',
|
|
86
|
+
path: 'unit/base/generic/t_nahimov.js',
|
|
87
|
+
func: test,
|
|
88
|
+
failures_info,
|
|
89
|
+
webdriver: '',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'unit/core',
|
|
97
|
+
path: 'unit/core/',
|
|
98
|
+
subtests: [
|
|
99
|
+
{
|
|
100
|
+
name: 'unit/core/t_presto.js',
|
|
101
|
+
path: 'unit/core/t_presto.js',
|
|
102
|
+
func: test,
|
|
103
|
+
failures_info,
|
|
104
|
+
webdriver: '',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
'build'
|
|
110
|
+
);
|
|
111
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { is_test_output, make_perform_function, fail } = require('../test.js');
|
|
4
|
+
|
|
5
|
+
module.exports.test = async () => {
|
|
6
|
+
let failures = [
|
|
7
|
+
[
|
|
8
|
+
'**',
|
|
9
|
+
[
|
|
10
|
+
[
|
|
11
|
+
'all',
|
|
12
|
+
'intermittent',
|
|
13
|
+
'*',
|
|
14
|
+
[`Server terminates connection`],
|
|
15
|
+
`Server terminates connection 421 error`,
|
|
16
|
+
],
|
|
17
|
+
],
|
|
18
|
+
],
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
await is_test_output(
|
|
22
|
+
make_perform_function([
|
|
23
|
+
{
|
|
24
|
+
name: 'unit',
|
|
25
|
+
subtests: [
|
|
26
|
+
{
|
|
27
|
+
name: 'unit/base',
|
|
28
|
+
subtests: [
|
|
29
|
+
{
|
|
30
|
+
name: 't_testo.js',
|
|
31
|
+
path: 't_testo.js',
|
|
32
|
+
failures,
|
|
33
|
+
func() {
|
|
34
|
+
fail('Server terminates connection');
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'unit/core',
|
|
41
|
+
subtests: [
|
|
42
|
+
{
|
|
43
|
+
name: 't_pesto.js',
|
|
44
|
+
path: 't_pesto.js',
|
|
45
|
+
failures,
|
|
46
|
+
func() {
|
|
47
|
+
fail('Server terminates connection');
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
]),
|
|
55
|
+
[
|
|
56
|
+
'\x1B[38;5;99mStarted\x1B[0m tests/',
|
|
57
|
+
'\x1B[38;5;99mStarted\x1B[0m unit',
|
|
58
|
+
'\x1B[38;5;99mStarted\x1B[0m unit/base',
|
|
59
|
+
'!Running: t_testo.js, path: t_testo.js',
|
|
60
|
+
'\x1B[33mWarning:\x1B[0m Server terminates connection',
|
|
61
|
+
'\x1B[35mIntermittent:\x1B[0m Server terminates connection 421 error',
|
|
62
|
+
'>t_testo.js has 1 intermittent(s)',
|
|
63
|
+
'>t_testo.js has 1 warnings(s)',
|
|
64
|
+
'>t_testo.js completed in',
|
|
65
|
+
'\x1B[38;5;243mCompleted\x1B[0m unit/base',
|
|
66
|
+
'\x1B[38;5;99mStarted\x1B[0m unit/core',
|
|
67
|
+
'!Running: t_pesto.js, path: t_pesto.js',
|
|
68
|
+
'\x1B[33mWarning:\x1B[0m Server terminates connection',
|
|
69
|
+
'\x1B[35mIntermittent:\x1B[0m Server terminates connection 421 error',
|
|
70
|
+
'>t_pesto.js has 1 intermittent(s)',
|
|
71
|
+
'>t_pesto.js has 1 warnings(s)',
|
|
72
|
+
'>t_pesto.js completed in',
|
|
73
|
+
'\x1B[38;5;243mCompleted\x1B[0m unit/core',
|
|
74
|
+
'\x1B[38;5;243mCompleted\x1B[0m unit',
|
|
75
|
+
'\x1B[38;5;243mCompleted\x1B[0m tests/',
|
|
76
|
+
],
|
|
77
|
+
[],
|
|
78
|
+
'global intermittents'
|
|
79
|
+
);
|
|
80
|
+
};
|
|
@@ -19,21 +19,53 @@ class Input extends AppDriver {
|
|
|
19
19
|
|
|
20
20
|
module.exports.test = do_self_tests(snippet, async session => {
|
|
21
21
|
// AppDriver: chainable
|
|
22
|
+
let expectations = session.isFirefox()
|
|
23
|
+
? [
|
|
24
|
+
`Action: Get Input`,
|
|
25
|
+
`Test: Input is shown. Selector: '#input'`,
|
|
26
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
27
|
+
`Ok: Input is shown`,
|
|
28
|
+
`Action: Input.type into Type hello`,
|
|
29
|
+
`Test: Focus. Selector: '#input'`,
|
|
30
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
31
|
+
`Ok: Focus`,
|
|
32
|
+
`Test: Focused. Selector: '#input'`,
|
|
33
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
34
|
+
`Ok: Focused`,
|
|
35
|
+
`Test: Select all text press Ctrl+A. Selector: '#input'`,
|
|
36
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
37
|
+
`Ok: Select all text press Ctrl+A`,
|
|
38
|
+
`Test: Type into Type hello. Selector: '#input'`,
|
|
39
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
40
|
+
`Ok: Type into Type hello`,
|
|
41
|
+
`Test: Check Type hello text. Expected: 'hello'. Selector: '#input'`,
|
|
42
|
+
`Ok: Check Type hello text, got: 'hello'`,
|
|
43
|
+
`Ok: Check Type hello text`,
|
|
44
|
+
]
|
|
45
|
+
: [
|
|
46
|
+
`Action: Get Input`,
|
|
47
|
+
`Test: Input is shown. Selector: '#input'`,
|
|
48
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
49
|
+
`Ok: Input is shown`,
|
|
50
|
+
`Action: Input.type into Type hello`,
|
|
51
|
+
`Test: Focus. Selector: '#input'`,
|
|
52
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
53
|
+
`Ok: Focus`,
|
|
54
|
+
`Test: Focused. Selector: '#input'`,
|
|
55
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
56
|
+
`Ok: Focused`,
|
|
57
|
+
`Test: Select all text`,
|
|
58
|
+
`Ok: Select all text`,
|
|
59
|
+
`Test: Type into Type hello. Selector: '#input'`,
|
|
60
|
+
`Ok: '#input' has to be unique, got: 1`,
|
|
61
|
+
`Ok: Type into Type hello`,
|
|
62
|
+
`Test: Check Type hello text. Expected: 'hello'. Selector: '#input'`,
|
|
63
|
+
`Ok: Check Type hello text, got: 'hello'`,
|
|
64
|
+
`Ok: Check Type hello text`,
|
|
65
|
+
];
|
|
22
66
|
await is_ok_output(
|
|
23
67
|
() => Input.get(session).type('hello'),
|
|
24
|
-
|
|
25
|
-
`Action: Get Input`,
|
|
26
|
-
`Test: Input is shown. Selector: '#input'`,
|
|
27
|
-
`Ok: '#input' has to be unique, got: 1`,
|
|
28
|
-
`Ok: Input is shown`,
|
|
29
|
-
`Action: Input.type into Type hello`,
|
|
30
|
-
`Test: Type into Type hello. Selector: '#input'`,
|
|
31
|
-
`Ok: '#input' has to be unique, got: 1`,
|
|
32
|
-
`Ok: Type into Type hello`,
|
|
33
|
-
`Test: Check Type hello text. Expected: 'hello'. Selector: '#input'`,
|
|
34
|
-
`Ok: Check Type hello text, got: 'hello'`,
|
|
35
|
-
`Ok: Check Type hello text`,
|
|
36
|
-
],
|
|
68
|
+
expectations,
|
|
37
69
|
[],
|
|
38
70
|
`AppDriver: chainable`
|
|
39
71
|
);
|
|
@@ -23,6 +23,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
23
23
|
|
|
24
24
|
// attributeIs: failure
|
|
25
25
|
await is_failure_output(
|
|
26
|
+
driver,
|
|
26
27
|
() => driver.attributeIs('#input', 'value', 'he', `attributeIs`),
|
|
27
28
|
[`Test: attributeIs. Expected: 'he'. Selector: '#input'`],
|
|
28
29
|
[
|
|
@@ -44,6 +44,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
44
44
|
|
|
45
45
|
// classNameStateIs: failure
|
|
46
46
|
await is_failure_output(
|
|
47
|
+
driver,
|
|
47
48
|
() =>
|
|
48
49
|
driver.classNameStateIs(
|
|
49
50
|
'#input',
|
|
@@ -74,6 +75,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
74
75
|
|
|
75
76
|
// innerHTMLIs: failure
|
|
76
77
|
await is_failure_output(
|
|
78
|
+
driver,
|
|
77
79
|
() => driver.innerHTMLIs('#button', 'button', `innerHTMLIs`),
|
|
78
80
|
[`Test: innerHTMLIs. Selector: '#button'`],
|
|
79
81
|
[
|
|
@@ -103,6 +105,7 @@ unexpected character: '<' at 0 pos, expected: 'b' at '' line`,
|
|
|
103
105
|
|
|
104
106
|
// propertyIs: failure
|
|
105
107
|
await is_failure_output(
|
|
108
|
+
driver,
|
|
106
109
|
() => driver.propertyIs('#button', 'id', 'button2', `propertyIs`),
|
|
107
110
|
[`Test: propertyIs. Selector: '#button'`],
|
|
108
111
|
[
|
|
@@ -32,6 +32,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
32
32
|
|
|
33
33
|
// scriptRetvalIs: failure
|
|
34
34
|
await is_failure_output(
|
|
35
|
+
driver,
|
|
35
36
|
() => driver.scriptRetvalIs('window.getValue()', 'heo', `scriptRetvalIs`),
|
|
36
37
|
[`Test: scriptRetvalIs. Expected: 'heo'`],
|
|
37
38
|
[
|
|
@@ -66,6 +67,7 @@ unexpected character: 'y' at 2 pos, expected: 'o' at '' line`,
|
|
|
66
67
|
|
|
67
68
|
// scriptRetvalContains: failure
|
|
68
69
|
await is_failure_output(
|
|
70
|
+
driver,
|
|
69
71
|
() =>
|
|
70
72
|
driver.scriptRetvalContains(
|
|
71
73
|
'window.getValues()',
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
do_self_tests,
|
|
5
|
+
is_ok_output,
|
|
6
|
+
} = require('./test.js');
|
|
7
|
+
|
|
8
|
+
const snippet = `
|
|
9
|
+
<html>
|
|
10
|
+
<script>
|
|
11
|
+
window.getSelection = selector => {
|
|
12
|
+
let el = document.querySelector(selector);
|
|
13
|
+
return [el.selectionStart, el.selectionEnd];
|
|
14
|
+
};
|
|
15
|
+
</script>
|
|
16
|
+
<body>
|
|
17
|
+
<input value='hey'>
|
|
18
|
+
<textarea>hey</textarea>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
24
|
+
let stdout = driver.firefox
|
|
25
|
+
? [
|
|
26
|
+
`Test: select input text press Ctrl+A. Selector: 'input'`,
|
|
27
|
+
`Ok: 'input' has to be unique, got: 1`,
|
|
28
|
+
`Ok: select input text press Ctrl+A`,
|
|
29
|
+
]
|
|
30
|
+
: [`Test: select input text`, `Ok: select input text`];
|
|
31
|
+
|
|
32
|
+
// selectAll:input
|
|
33
|
+
await is_ok_output(
|
|
34
|
+
() => driver.selectAll('input', `select input text`),
|
|
35
|
+
stdout,
|
|
36
|
+
[],
|
|
37
|
+
`selectAll:input`
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
await driver.scriptRetvalIs(
|
|
41
|
+
`window.getSelection('input')`,
|
|
42
|
+
[0, 3],
|
|
43
|
+
'input text is selected'
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// selectAll:textarea
|
|
47
|
+
stdout = driver.firefox
|
|
48
|
+
? [
|
|
49
|
+
`Test: select textarea text press Ctrl+A. Selector: 'textarea'`,
|
|
50
|
+
`Ok: 'textarea' has to be unique, got: 1`,
|
|
51
|
+
`Ok: select textarea text press Ctrl+A`,
|
|
52
|
+
]
|
|
53
|
+
: [`Test: select textarea text`, `Ok: select textarea text`];
|
|
54
|
+
|
|
55
|
+
await is_ok_output(
|
|
56
|
+
() => driver.selectAll('textarea', `select textarea text`),
|
|
57
|
+
stdout,
|
|
58
|
+
[],
|
|
59
|
+
`selectAll:textarea`
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
await driver.scriptRetvalIs(
|
|
63
|
+
`window.getSelection('textarea')`,
|
|
64
|
+
[0, 3],
|
|
65
|
+
'textarea text is selected'
|
|
66
|
+
);
|
|
67
|
+
});
|
|
@@ -27,6 +27,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
27
27
|
|
|
28
28
|
// textSelected:failure
|
|
29
29
|
await is_failure_output(
|
|
30
|
+
driver,
|
|
30
31
|
() => driver.textSelected('#unselected-input', `textSelected`),
|
|
31
32
|
[
|
|
32
33
|
`Test: textSelected. Expected: text should be selected. Selector: '#unselected-input'`,
|
|
@@ -42,6 +42,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
42
42
|
|
|
43
43
|
// textIs: failure
|
|
44
44
|
await is_failure_output(
|
|
45
|
+
driver,
|
|
45
46
|
() => driver.textIs('#p', 'Para', `textIs`),
|
|
46
47
|
[`Test: textIs. Expected: 'Para'. Selector: '#p'`],
|
|
47
48
|
[
|
|
@@ -54,6 +55,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
54
55
|
|
|
55
56
|
// textIs: ambigious
|
|
56
57
|
await is_failure_output(
|
|
58
|
+
driver,
|
|
57
59
|
() => driver.textIs('p', 'Para', `textIs`),
|
|
58
60
|
[`Test: textIs. Expected: 'Para'. Selector: 'p'`],
|
|
59
61
|
[
|
|
@@ -65,6 +67,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
65
67
|
|
|
66
68
|
// textIs: no elements
|
|
67
69
|
await is_failure_output(
|
|
70
|
+
driver,
|
|
68
71
|
() => driver.textIs('#p-not-exists', 'Para', `textIs`),
|
|
69
72
|
[`Test: textIs. Expected: 'Para'. Selector: '#p-not-exists'`],
|
|
70
73
|
[
|
|
@@ -112,6 +115,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
112
115
|
|
|
113
116
|
// textStartsWith: failure
|
|
114
117
|
await is_failure_output(
|
|
118
|
+
driver,
|
|
115
119
|
() => driver.textStartsWith('#p', 'Mara', `textStartsWith`),
|
|
116
120
|
[`Test: textStartsWith. Expected: starts with 'Mara'. Selector: '#p'`],
|
|
117
121
|
[
|
|
@@ -24,6 +24,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
24
24
|
|
|
25
25
|
// textIs: failure
|
|
26
26
|
await is_failure_output(
|
|
27
|
+
driver,
|
|
27
28
|
() => driver.textIsAll('p', ['Para', 'Mara'], `textIsAll`),
|
|
28
29
|
[`Test: textIsAll. Expected: ['Para', 'Mara']. Selector: 'p'`],
|
|
29
30
|
[
|
|
@@ -37,6 +38,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
37
38
|
|
|
38
39
|
// textIs: ambigious
|
|
39
40
|
await is_failure_output(
|
|
41
|
+
driver,
|
|
40
42
|
() => driver.textIsAll('p', ['Para'], `textIsAll`),
|
|
41
43
|
[`Test: textIsAll. Expected: ['Para']. Selector: 'p'`],
|
|
42
44
|
[
|
|
@@ -48,6 +50,7 @@ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
|
|
|
48
50
|
|
|
49
51
|
// textIs: no elements
|
|
50
52
|
await is_failure_output(
|
|
53
|
+
driver,
|
|
51
54
|
() => driver.textIs('#p-not-exists', ['Para'], `textIsAll`),
|
|
52
55
|
[`Test: textIsAll. Expected: ['Para']. Selector: '#p-not-exists'`],
|
|
53
56
|
[
|
package/tests/webdriver/test.js
CHANGED
|
@@ -11,6 +11,7 @@ const scripts = [
|
|
|
11
11
|
'../../core/core.js',
|
|
12
12
|
'../../core/base.js',
|
|
13
13
|
'../../webdriver/app_driver.js',
|
|
14
|
+
'../../webdriver/control_driver.js',
|
|
14
15
|
];
|
|
15
16
|
for (let script of scripts) {
|
|
16
17
|
let script_exports = require(script);
|
|
@@ -62,7 +63,12 @@ module.exports.is_ok_output = (func, out, err, msg) => {
|
|
|
62
63
|
return is_output(eat_ok(func), out, err, msg);
|
|
63
64
|
};
|
|
64
65
|
|
|
65
|
-
module.exports.is_failure_output = (func, out, err, msg) => {
|
|
66
|
+
module.exports.is_failure_output = (driver, func, out, err, msg) => {
|
|
67
|
+
// Tests in Firefox are running in a child process, which doesn't use stderr.
|
|
68
|
+
if (driver.firefox) {
|
|
69
|
+
out.push(...err);
|
|
70
|
+
err = [];
|
|
71
|
+
}
|
|
66
72
|
out.push(`Sleeping for 1 ms`);
|
|
67
73
|
return is_output(eat_failure(func), out, err, msg);
|
|
68
74
|
};
|
package/webdriver/app_driver.js
CHANGED
|
@@ -74,6 +74,9 @@ class AppDriver {
|
|
|
74
74
|
type(selector, value, field) {
|
|
75
75
|
return this.chain(() =>
|
|
76
76
|
this.action(`${this.uiname}.type into ${field}`)
|
|
77
|
+
.sendKeys(selector, '', `Focus`)
|
|
78
|
+
.elementFocused(selector, 'Focused')
|
|
79
|
+
.selectAll(selector, `Select all text`)
|
|
77
80
|
.sendKeys(selector, value, `Type into ${field}`)
|
|
78
81
|
.textIs(selector, value, `Check ${field} text`)
|
|
79
82
|
);
|
|
@@ -157,27 +160,6 @@ class AppDriver {
|
|
|
157
160
|
}
|
|
158
161
|
}
|
|
159
162
|
|
|
160
|
-
/**
|
|
161
|
-
* Control driver base.
|
|
162
|
-
*/
|
|
163
|
-
class ControlDriver extends AppDriver {
|
|
164
|
-
static get(session, selector, p) {
|
|
165
|
-
assert(selector, `No selector for ${this.name}`);
|
|
166
|
-
return this._get(
|
|
167
|
-
{
|
|
168
|
-
session,
|
|
169
|
-
selector,
|
|
170
|
-
},
|
|
171
|
-
p
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
get Self() {
|
|
176
|
-
return this.selector;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
163
|
module.exports = {
|
|
181
164
|
AppDriver,
|
|
182
|
-
ControlDriver,
|
|
183
165
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { assert } = require('../core/core.js');
|
|
4
|
+
const { AppDriver } = require('./app_driver.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Control driver base.
|
|
8
|
+
*/
|
|
9
|
+
class ControlDriver extends AppDriver {
|
|
10
|
+
static get(session, selector, p) {
|
|
11
|
+
assert(selector, `No selector for ${this.name}`);
|
|
12
|
+
return this._get(
|
|
13
|
+
{
|
|
14
|
+
session,
|
|
15
|
+
selector,
|
|
16
|
+
},
|
|
17
|
+
p
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
get uiname() {
|
|
22
|
+
return `${super.uiname}@selector='${this.Self}'`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get Self() {
|
|
26
|
+
return this.selector;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = {
|
|
31
|
+
ControlDriver,
|
|
32
|
+
};
|
package/webdriver/driver.js
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const { is_mac, stringify } = require('../core/util.js');
|
|
4
|
-
|
|
5
|
-
const { getTimeout, DriverBase } = require('./driver_base.js');
|
|
6
|
-
|
|
7
3
|
const { By, Condition, Key, until } = require('selenium-webdriver');
|
|
8
4
|
|
|
9
|
-
const { assert } = require('../core/core.js');
|
|
10
|
-
|
|
11
5
|
const { test_is, test_contains, is, contains, ok } = require('../core/base.js');
|
|
12
|
-
|
|
13
|
-
const { toDataURL } = require('../core/util.js');
|
|
6
|
+
const { assert } = require('../core/core.js');
|
|
7
|
+
const { is_mac, stringify, toDataURL } = require('../core/util.js');
|
|
8
|
+
const { log } = require('../logging/logging.js');
|
|
9
|
+
const { getTimeout, DriverBase } = require('./driver_base.js');
|
|
14
10
|
|
|
15
11
|
/**
|
|
16
12
|
* A chainable web driver providing a number of handy methods to navigate
|
|
@@ -120,25 +116,35 @@ class Driver extends DriverBase {
|
|
|
120
116
|
*/
|
|
121
117
|
sleep(sec) {
|
|
122
118
|
return this.chain(() => {
|
|
123
|
-
|
|
119
|
+
log(`Sleeping ${sec} sec(s)`);
|
|
124
120
|
return this.dvr.sleep(1000 * sec);
|
|
125
121
|
});
|
|
126
122
|
}
|
|
127
123
|
|
|
124
|
+
async flush() {
|
|
125
|
+
let link;
|
|
126
|
+
do {
|
|
127
|
+
link = this.dvr.lastChainLink;
|
|
128
|
+
await link;
|
|
129
|
+
} while (link != this.dvr.lastChainLink);
|
|
130
|
+
}
|
|
131
|
+
|
|
128
132
|
/**
|
|
129
133
|
* Quits.
|
|
130
134
|
*/
|
|
131
135
|
quit() {
|
|
132
|
-
return this.
|
|
133
|
-
|
|
134
|
-
|
|
136
|
+
return this.flush()
|
|
137
|
+
.then(() => this.browserLogs())
|
|
138
|
+
.then(() => this.dvr.quit().then(() => log(`Driver has quit`)));
|
|
135
139
|
}
|
|
136
140
|
|
|
137
141
|
/**
|
|
138
142
|
* Closes currently focused window.
|
|
139
143
|
*/
|
|
140
144
|
close() {
|
|
141
|
-
return this.
|
|
145
|
+
return this.flush()
|
|
146
|
+
.then(() => this.browserLogs())
|
|
147
|
+
.then(() => this.dvr.close());
|
|
142
148
|
}
|
|
143
149
|
|
|
144
150
|
//
|
|
@@ -784,7 +790,7 @@ class Driver extends DriverBase {
|
|
|
784
790
|
// ctlr+A doens't work OS X in Chrome.
|
|
785
791
|
let script = `
|
|
786
792
|
let el = document.querySelector('${selector}');
|
|
787
|
-
if (el instanceof HTMLInputElement) {
|
|
793
|
+
if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
|
|
788
794
|
el.select();
|
|
789
795
|
}
|
|
790
796
|
else {
|