@appium/base-driver 8.5.7 → 8.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.js +2 -2
- package/build/lib/basedriver/commands/execute.d.ts +11 -0
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -0
- package/build/lib/basedriver/commands/execute.js +62 -0
- package/build/lib/basedriver/commands/index.d.ts +1 -1
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +5 -2
- package/build/lib/basedriver/commands/log.js +2 -4
- package/build/lib/basedriver/core.d.ts +11 -0
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +6 -1
- package/build/lib/basedriver/helpers.js +2 -2
- package/build/lib/express/server.d.ts +70 -7
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +19 -16
- package/build/lib/express/websocket.d.ts +12 -30
- package/build/lib/express/websocket.d.ts.map +1 -1
- package/build/lib/express/websocket.js +6 -4
- package/build/lib/index.d.ts +12 -180
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +107 -80
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
- package/build/lib/jsonwp-proxy/proxy.js +3 -7
- package/build/lib/protocol/index.d.ts +3 -1
- package/build/lib/protocol/index.js +13 -1
- package/build/lib/protocol/protocol.d.ts +8 -4
- package/build/lib/protocol/protocol.d.ts.map +1 -1
- package/build/lib/protocol/protocol.js +7 -7
- package/build/lib/protocol/routes.js +2 -6
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/commands/execute.js +65 -0
- package/lib/basedriver/commands/index.js +3 -1
- package/lib/basedriver/core.js +15 -0
- package/lib/express/server.js +126 -36
- package/lib/express/websocket.js +13 -11
- package/lib/index.js +19 -61
- package/lib/protocol/index.js +4 -0
- package/lib/protocol/protocol.js +10 -3
- package/package.json +17 -15
- package/build/test/basedriver/README.md +0 -5
- package/build/test/basedriver/driver-e2e-tests.js +0 -413
- package/build/test/basedriver/driver-tests.js +0 -572
- package/build/test/basedriver/index.js +0 -26
- package/build/test/e2e/basedriver/driver.e2e.spec.js +0 -15
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +0 -192
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +0 -87
- package/build/test/e2e/express/server.e2e.spec.js +0 -159
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +0 -59
- package/build/test/e2e/protocol/fake-driver.js +0 -163
- package/build/test/e2e/protocol/helpers.js +0 -25
- package/build/test/e2e/protocol/protocol.e2e.spec.js +0 -1186
- package/build/test/helpers.js +0 -55
- package/build/test/unit/basedriver/capabilities.spec.js +0 -672
- package/build/test/unit/basedriver/capability.spec.js +0 -353
- package/build/test/unit/basedriver/commands/event.spec.js +0 -110
- package/build/test/unit/basedriver/commands/log.spec.js +0 -92
- package/build/test/unit/basedriver/device-settings.spec.js +0 -97
- package/build/test/unit/basedriver/driver.spec.js +0 -15
- package/build/test/unit/basedriver/helpers.spec.js +0 -151
- package/build/test/unit/basedriver/timeout.spec.js +0 -135
- package/build/test/unit/express/server.spec.js +0 -155
- package/build/test/unit/express/static.spec.js +0 -26
- package/build/test/unit/jsonwp-proxy/mock-request.js +0 -91
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +0 -171
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +0 -292
- package/build/test/unit/jsonwp-proxy/url.spec.js +0 -165
- package/build/test/unit/jsonwp-status/status.spec.js +0 -34
- package/build/test/unit/protocol/errors.spec.js +0 -390
- package/build/test/unit/protocol/routes.spec.js +0 -80
- package/build/test/unit/protocol/validator.spec.js +0 -149
- package/test/basedriver/README.md +0 -5
- package/test/basedriver/driver-e2e-tests.js +0 -386
- package/test/basedriver/driver-tests.js +0 -624
- package/test/basedriver/index.js +0 -6
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("source-map-support/register");
|
|
4
|
-
|
|
5
|
-
var _validators = require("../../../lib/protocol/validators");
|
|
6
|
-
|
|
7
|
-
describe('Protocol', function () {
|
|
8
|
-
describe('direct to driver', function () {
|
|
9
|
-
describe('setUrl', function () {
|
|
10
|
-
it('should fail when no url passed', function () {
|
|
11
|
-
(() => {
|
|
12
|
-
_validators.validators.setUrl();
|
|
13
|
-
}).should.throw(/url/i);
|
|
14
|
-
});
|
|
15
|
-
it('should fail when given invalid url', function () {
|
|
16
|
-
(() => {
|
|
17
|
-
_validators.validators.setUrl('foo');
|
|
18
|
-
}).should.throw(/url/i);
|
|
19
|
-
});
|
|
20
|
-
it('should succeed when given url starting with http', function () {
|
|
21
|
-
(() => {
|
|
22
|
-
_validators.validators.setUrl('http://appium.io');
|
|
23
|
-
}).should.not.throw();
|
|
24
|
-
});
|
|
25
|
-
it('should succeed when given an android-like scheme', function () {
|
|
26
|
-
(() => {
|
|
27
|
-
_validators.validators.setUrl('content://contacts/people/1');
|
|
28
|
-
}).should.not.throw();
|
|
29
|
-
});
|
|
30
|
-
it('should succeed with hyphens dots and plus chars in the scheme', function () {
|
|
31
|
-
(() => {
|
|
32
|
-
_validators.validators.setUrl('my-app.a+b://login');
|
|
33
|
-
}).should.not.throw();
|
|
34
|
-
});
|
|
35
|
-
it('should succeed when given an about scheme', function () {
|
|
36
|
-
(() => {
|
|
37
|
-
_validators.validators.setUrl('about:blank');
|
|
38
|
-
}).should.not.throw();
|
|
39
|
-
});
|
|
40
|
-
it('should succeed when given a data scheme', function () {
|
|
41
|
-
(() => {
|
|
42
|
-
_validators.validators.setUrl('data:text/html,<html></html>');
|
|
43
|
-
}).should.not.throw();
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
describe('implicitWait', function () {
|
|
47
|
-
it('should fail when given no ms', function () {
|
|
48
|
-
(() => {
|
|
49
|
-
_validators.validators.implicitWait();
|
|
50
|
-
}).should.throw(/ms/i);
|
|
51
|
-
});
|
|
52
|
-
it('should fail when given a non-numeric ms', function () {
|
|
53
|
-
(() => {
|
|
54
|
-
_validators.validators.implicitWait('five');
|
|
55
|
-
}).should.throw(/ms/i);
|
|
56
|
-
});
|
|
57
|
-
it('should fail when given a negative ms', function () {
|
|
58
|
-
(() => {
|
|
59
|
-
_validators.validators.implicitWait(-1);
|
|
60
|
-
}).should.throw(/ms/i);
|
|
61
|
-
});
|
|
62
|
-
it('should succeed when given an ms of 0', function () {
|
|
63
|
-
(() => {
|
|
64
|
-
_validators.validators.implicitWait(0);
|
|
65
|
-
}).should.not.throw();
|
|
66
|
-
});
|
|
67
|
-
it('should succeed when given an ms greater than 0', function () {
|
|
68
|
-
(() => {
|
|
69
|
-
_validators.validators.implicitWait(100);
|
|
70
|
-
}).should.not.throw();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe('asyncScriptTimeout', function () {
|
|
74
|
-
it('should fail when given no ms', function () {
|
|
75
|
-
(() => {
|
|
76
|
-
_validators.validators.asyncScriptTimeout();
|
|
77
|
-
}).should.throw(/ms/i);
|
|
78
|
-
});
|
|
79
|
-
it('should fail when given a non-numeric ms', function () {
|
|
80
|
-
(() => {
|
|
81
|
-
_validators.validators.asyncScriptTimeout('five');
|
|
82
|
-
}).should.throw(/ms/i);
|
|
83
|
-
});
|
|
84
|
-
it('should fail when given a negative ms', function () {
|
|
85
|
-
(() => {
|
|
86
|
-
_validators.validators.asyncScriptTimeout(-1);
|
|
87
|
-
}).should.throw(/ms/i);
|
|
88
|
-
});
|
|
89
|
-
it('should succeed when given an ms of 0', function () {
|
|
90
|
-
(() => {
|
|
91
|
-
_validators.validators.asyncScriptTimeout(0);
|
|
92
|
-
}).should.not.throw();
|
|
93
|
-
});
|
|
94
|
-
it('should succeed when given an ms greater than 0', function () {
|
|
95
|
-
(() => {
|
|
96
|
-
_validators.validators.asyncScriptTimeout(100);
|
|
97
|
-
}).should.not.throw();
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
describe('clickCurrent', function () {
|
|
101
|
-
it('should fail when given an invalid button', function () {
|
|
102
|
-
(() => {
|
|
103
|
-
_validators.validators.clickCurrent(4);
|
|
104
|
-
}).should.throw(/0, 1, or 2/i);
|
|
105
|
-
});
|
|
106
|
-
it('should succeed when given a valid button', function () {
|
|
107
|
-
(() => {
|
|
108
|
-
_validators.validators.clickCurrent(0);
|
|
109
|
-
}).should.not.throw();
|
|
110
|
-
(() => {
|
|
111
|
-
_validators.validators.clickCurrent(1);
|
|
112
|
-
}).should.not.throw();
|
|
113
|
-
(() => {
|
|
114
|
-
_validators.validators.clickCurrent(2);
|
|
115
|
-
}).should.not.throw();
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
describe('setNetworkConnection', function () {
|
|
119
|
-
it('should fail when given no type', function () {
|
|
120
|
-
(() => {
|
|
121
|
-
_validators.validators.setNetworkConnection();
|
|
122
|
-
}).should.throw(/0, 1, 2, 4, 6/i);
|
|
123
|
-
});
|
|
124
|
-
it('should fail when given an invalid type', function () {
|
|
125
|
-
(() => {
|
|
126
|
-
_validators.validators.setNetworkConnection(8);
|
|
127
|
-
}).should.throw(/0, 1, 2, 4, 6/i);
|
|
128
|
-
});
|
|
129
|
-
it('should succeed when given a valid type', function () {
|
|
130
|
-
(() => {
|
|
131
|
-
_validators.validators.setNetworkConnection(0);
|
|
132
|
-
}).should.not.throw();
|
|
133
|
-
(() => {
|
|
134
|
-
_validators.validators.setNetworkConnection(1);
|
|
135
|
-
}).should.not.throw();
|
|
136
|
-
(() => {
|
|
137
|
-
_validators.validators.setNetworkConnection(2);
|
|
138
|
-
}).should.not.throw();
|
|
139
|
-
(() => {
|
|
140
|
-
_validators.validators.setNetworkConnection(4);
|
|
141
|
-
}).should.not.throw();
|
|
142
|
-
(() => {
|
|
143
|
-
_validators.validators.setNetworkConnection(6);
|
|
144
|
-
}).should.not.throw();
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwidmFsaWRhdG9ycyIsInNldFVybCIsInNob3VsZCIsInRocm93Iiwibm90IiwiaW1wbGljaXRXYWl0IiwiYXN5bmNTY3JpcHRUaW1lb3V0IiwiY2xpY2tDdXJyZW50Iiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvcHJvdG9jb2wvdmFsaWRhdG9yLnNwZWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCB7dmFsaWRhdG9yc30gZnJvbSAnLi4vLi4vLi4vbGliL3Byb3RvY29sL3ZhbGlkYXRvcnMnO1xuXG5kZXNjcmliZSgnUHJvdG9jb2wnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdkaXJlY3QgdG8gZHJpdmVyJywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCdzZXRVcmwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBubyB1cmwgcGFzc2VkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0VXJsKCk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvdXJsL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBpbnZhbGlkIHVybCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldFVybCgnZm9vJyk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvdXJsL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiB1cmwgc3RhcnRpbmcgd2l0aCBodHRwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0VXJsKCdodHRwOi8vYXBwaXVtLmlvJyk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdoZW4gZ2l2ZW4gYW4gYW5kcm9pZC1saWtlIHNjaGVtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldFVybCgnY29udGVudDovL2NvbnRhY3RzL3Blb3BsZS8xJyk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggaHlwaGVucyBkb3RzIGFuZCBwbHVzIGNoYXJzIGluIHRoZSBzY2hlbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXRVcmwoJ215LWFwcC5hK2I6Ly9sb2dpbicpO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGFuIGFib3V0IHNjaGVtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldFVybCgnYWJvdXQ6YmxhbmsnKTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhIGRhdGEgc2NoZW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0VXJsKCdkYXRhOnRleHQvaHRtbCw8aHRtbD48L2h0bWw+Jyk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdpbXBsaWNpdFdhaXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBubyBtcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmltcGxpY2l0V2FpdCgpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBhIG5vbi1udW1lcmljIG1zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuaW1wbGljaXRXYWl0KCdmaXZlJyk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvbXMvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5pbXBsaWNpdFdhaXQoLTEpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhbiBtcyBvZiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuaW1wbGljaXRXYWl0KDApO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGFuIG1zIGdyZWF0ZXIgdGhhbiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuaW1wbGljaXRXYWl0KDEwMCk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdhc3luY1NjcmlwdFRpbWVvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBubyBtcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmFzeW5jU2NyaXB0VGltZW91dCgpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBhIG5vbi1udW1lcmljIG1zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuYXN5bmNTY3JpcHRUaW1lb3V0KCdmaXZlJyk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvbXMvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5hc3luY1NjcmlwdFRpbWVvdXQoLTEpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhbiBtcyBvZiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuYXN5bmNTY3JpcHRUaW1lb3V0KDApO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGFuIG1zIGdyZWF0ZXIgdGhhbiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuYXN5bmNTY3JpcHRUaW1lb3V0KDEwMCk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdjbGlja0N1cnJlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBhbiBpbnZhbGlkIGJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmNsaWNrQ3VycmVudCg0KTtcbiAgICAgICAgfSkuc2hvdWxkLnRocm93KC8wLCAxLCBvciAyL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhIHZhbGlkIGJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmNsaWNrQ3VycmVudCgwKTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuY2xpY2tDdXJyZW50KDEpO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5jbGlja0N1cnJlbnQoMik7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdzZXROZXR3b3JrQ29ubmVjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIG5vIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXROZXR3b3JrQ29ubmVjdGlvbigpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coLzAsIDEsIDIsIDQsIDYvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIGFuIGludmFsaWQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldE5ldHdvcmtDb25uZWN0aW9uKDgpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coLzAsIDEsIDIsIDQsIDYvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGEgdmFsaWQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldE5ldHdvcmtDb25uZWN0aW9uKDApO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXROZXR3b3JrQ29ubmVjdGlvbigxKTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0TmV0d29ya0Nvbm5lY3Rpb24oMik7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldE5ldHdvcmtDb25uZWN0aW9uKDQpO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXROZXR3b3JrQ29ubmVjdGlvbig2KTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFQTs7QUFFQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFZO0VBQy9CQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtJQUN2Q0EsUUFBUSxDQUFDLFFBQUQsRUFBVyxZQUFZO01BQzdCQyxFQUFFLENBQUMsZ0NBQUQsRUFBbUMsWUFBWTtRQUMvQyxDQUFDLE1BQU07VUFDTEMsc0JBQUEsQ0FBV0MsTUFBWDtRQUNELENBRkQsRUFFR0MsTUFGSCxDQUVVQyxLQUZWLENBRWdCLE1BRmhCO01BR0QsQ0FKQyxDQUFGO01BS0FKLEVBQUUsQ0FBQyxvQ0FBRCxFQUF1QyxZQUFZO1FBQ25E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
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# Driver Test Helpers
|
|
2
|
-
|
|
3
|
-
This directory contains modules which expose test suites that an external driver can use to test against the base implementation. They are published in the `@appium/base-driver` package.
|
|
4
|
-
|
|
5
|
-
Drivers wanting to leverage these suites will want to add `@appium/base-driver` to their `devDependencies`.
|
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash';
|
|
2
|
-
import {BaseDriver, server, routeConfiguringFunction, DeviceSettings} from '../../lib';
|
|
3
|
-
import axios from 'axios';
|
|
4
|
-
import B from 'bluebird';
|
|
5
|
-
import {TEST_HOST, getTestPort, createAppiumURL, METHODS} from '../helpers';
|
|
6
|
-
import {PREFIXED_APPIUM_OPTS_CAP} from '../../lib/basedriver/capabilities';
|
|
7
|
-
const {POST, DELETE} = METHODS;
|
|
8
|
-
|
|
9
|
-
function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
|
|
10
|
-
let address = defaultCaps['appium:address'] ?? TEST_HOST;
|
|
11
|
-
let port = defaultCaps['appium:port'];
|
|
12
|
-
const className = DriverClass.name || '(unknown driver)';
|
|
13
|
-
|
|
14
|
-
describe(`BaseDriver E2E (as ${className})`, function () {
|
|
15
|
-
let baseServer, d;
|
|
16
|
-
/**
|
|
17
|
-
* This URL creates a new session
|
|
18
|
-
* @type {string}
|
|
19
|
-
**/
|
|
20
|
-
let newSessionURL;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Creates a URL with base host/port. Supply `session` and `pathname`
|
|
24
|
-
* @type {_.CurriedFunction2<string,string,string>}
|
|
25
|
-
*/
|
|
26
|
-
let createAppiumTestURL;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Creates a URL with the given session ID and a blank pathname;
|
|
30
|
-
* e.g., `http://foo.bar:123/session/<session-id>`
|
|
31
|
-
* @type {_.CurriedFunction1<string,string>}
|
|
32
|
-
*/
|
|
33
|
-
let createSessionURL;
|
|
34
|
-
|
|
35
|
-
before(async function () {
|
|
36
|
-
port = port ?? (await getTestPort());
|
|
37
|
-
defaultCaps = {...defaultCaps, 'appium:port': port};
|
|
38
|
-
d = new DriverClass({port, address});
|
|
39
|
-
baseServer = await server({
|
|
40
|
-
routeConfiguringFunction: routeConfiguringFunction(d),
|
|
41
|
-
port,
|
|
42
|
-
hostname: TEST_HOST,
|
|
43
|
-
});
|
|
44
|
-
createAppiumTestURL = createAppiumURL(address, port);
|
|
45
|
-
newSessionURL = createAppiumTestURL('', 'session');
|
|
46
|
-
createSessionURL = createAppiumTestURL(_, '');
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
after(async function () {
|
|
50
|
-
await baseServer.close();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
async function startSession(caps) {
|
|
54
|
-
return (
|
|
55
|
-
await axios({
|
|
56
|
-
url: newSessionURL,
|
|
57
|
-
method: POST,
|
|
58
|
-
data: {capabilities: {alwaysMatch: caps, firstMatch: [{}]}},
|
|
59
|
-
})
|
|
60
|
-
).data.value;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async function endSession(id) {
|
|
64
|
-
return (
|
|
65
|
-
await axios({
|
|
66
|
-
url: createSessionURL(id),
|
|
67
|
-
method: DELETE,
|
|
68
|
-
validateStatus: null,
|
|
69
|
-
})
|
|
70
|
-
).data.value;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async function getSession(id) {
|
|
74
|
-
return (
|
|
75
|
-
await axios({
|
|
76
|
-
url: createSessionURL(id),
|
|
77
|
-
})
|
|
78
|
-
).data.value;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
describe('session handling', function () {
|
|
82
|
-
it('should handle idempotency while creating sessions', async function () {
|
|
83
|
-
const sessionIds = [];
|
|
84
|
-
let times = 0;
|
|
85
|
-
do {
|
|
86
|
-
const {sessionId} = (
|
|
87
|
-
await axios({
|
|
88
|
-
url: newSessionURL,
|
|
89
|
-
headers: {
|
|
90
|
-
'X-Idempotency-Key': '123456',
|
|
91
|
-
},
|
|
92
|
-
method: POST,
|
|
93
|
-
data: {
|
|
94
|
-
capabilities: {alwaysMatch: defaultCaps, firstMatch: [{}]},
|
|
95
|
-
},
|
|
96
|
-
simple: false,
|
|
97
|
-
resolveWithFullResponse: true,
|
|
98
|
-
})
|
|
99
|
-
).data.value;
|
|
100
|
-
|
|
101
|
-
sessionIds.push(sessionId);
|
|
102
|
-
times++;
|
|
103
|
-
} while (times < 2);
|
|
104
|
-
_.uniq(sessionIds).length.should.equal(1);
|
|
105
|
-
|
|
106
|
-
const {status, data} = await axios({
|
|
107
|
-
url: createSessionURL(sessionIds[0]),
|
|
108
|
-
method: DELETE,
|
|
109
|
-
});
|
|
110
|
-
status.should.equal(200);
|
|
111
|
-
should.equal(data.value, null);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('should handle idempotency while creating parallel sessions', async function () {
|
|
115
|
-
const reqs = [];
|
|
116
|
-
let times = 0;
|
|
117
|
-
do {
|
|
118
|
-
reqs.push(
|
|
119
|
-
axios({
|
|
120
|
-
url: newSessionURL,
|
|
121
|
-
headers: {
|
|
122
|
-
'X-Idempotency-Key': '12345',
|
|
123
|
-
},
|
|
124
|
-
method: POST,
|
|
125
|
-
data: {
|
|
126
|
-
capabilities: {alwaysMatch: defaultCaps, firstMatch: [{}]},
|
|
127
|
-
},
|
|
128
|
-
})
|
|
129
|
-
);
|
|
130
|
-
times++;
|
|
131
|
-
} while (times < 2);
|
|
132
|
-
const sessionIds = (await B.all(reqs)).map((x) => x.data.value.sessionId);
|
|
133
|
-
_.uniq(sessionIds).length.should.equal(1);
|
|
134
|
-
|
|
135
|
-
const {status, data} = await axios({
|
|
136
|
-
url: createSessionURL(sessionIds[0]),
|
|
137
|
-
method: DELETE,
|
|
138
|
-
});
|
|
139
|
-
status.should.equal(200);
|
|
140
|
-
should.equal(data.value, null);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('should create session and retrieve a session id, then delete it', async function () {
|
|
144
|
-
let {status, data} = await axios({
|
|
145
|
-
url: newSessionURL,
|
|
146
|
-
method: POST,
|
|
147
|
-
data: {capabilities: {alwaysMatch: defaultCaps, firstMatch: [{}]}},
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
status.should.equal(200);
|
|
151
|
-
should.exist(data.value.sessionId);
|
|
152
|
-
data.value.capabilities.platformName.should.equal(defaultCaps.platformName);
|
|
153
|
-
data.value.capabilities.deviceName.should.equal(defaultCaps['appium:deviceName']);
|
|
154
|
-
|
|
155
|
-
({status, data} = await axios({
|
|
156
|
-
url: createSessionURL(d.sessionId),
|
|
157
|
-
method: DELETE,
|
|
158
|
-
}));
|
|
159
|
-
|
|
160
|
-
status.should.equal(200);
|
|
161
|
-
should.equal(data.value, null);
|
|
162
|
-
should.equal(d.sessionId, null);
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it.skip('should throw NYI for commands not implemented', async function () {});
|
|
167
|
-
|
|
168
|
-
describe('command timeouts', function () {
|
|
169
|
-
let originalFindElement, originalFindElements;
|
|
170
|
-
|
|
171
|
-
async function startTimeoutSession(timeout) {
|
|
172
|
-
const caps = _.cloneDeep(defaultCaps);
|
|
173
|
-
caps['appium:newCommandTimeout'] = timeout;
|
|
174
|
-
return await startSession(caps);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
before(function () {
|
|
178
|
-
originalFindElement = d.findElement;
|
|
179
|
-
d.findElement = function () {
|
|
180
|
-
return 'foo';
|
|
181
|
-
}.bind(d);
|
|
182
|
-
|
|
183
|
-
originalFindElements = d.findElements;
|
|
184
|
-
d.findElements = async function () {
|
|
185
|
-
await B.delay(200);
|
|
186
|
-
return ['foo'];
|
|
187
|
-
}.bind(d);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
after(function () {
|
|
191
|
-
d.findElement = originalFindElement;
|
|
192
|
-
d.findElements = originalFindElements;
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it('should set a default commandTimeout', async function () {
|
|
196
|
-
let newSession = await startTimeoutSession();
|
|
197
|
-
d.newCommandTimeoutMs.should.be.above(0);
|
|
198
|
-
await endSession(newSession.sessionId);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('should timeout on commands using commandTimeout cap', async function () {
|
|
202
|
-
let newSession = await startTimeoutSession(0.25);
|
|
203
|
-
// XXX: race condition: we must build this URL before ...something happens...
|
|
204
|
-
// which causes `d.sessionId` to be missing
|
|
205
|
-
let sessionURL = createSessionURL(d.sessionId);
|
|
206
|
-
await axios({
|
|
207
|
-
url: createAppiumTestURL(d.sessionId, 'element'),
|
|
208
|
-
method: POST,
|
|
209
|
-
data: {using: 'name', value: 'foo'},
|
|
210
|
-
});
|
|
211
|
-
await B.delay(400);
|
|
212
|
-
const {data} = await axios({
|
|
213
|
-
url: sessionURL,
|
|
214
|
-
validateStatus: null,
|
|
215
|
-
});
|
|
216
|
-
should.equal(data.value.error, 'invalid session id');
|
|
217
|
-
should.equal(d.sessionId, null);
|
|
218
|
-
const resp = await endSession(newSession.sessionId);
|
|
219
|
-
should.equal(resp.error, 'invalid session id');
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('should not timeout with commandTimeout of false', async function () {
|
|
223
|
-
let newSession = await startTimeoutSession(0.1);
|
|
224
|
-
let start = Date.now();
|
|
225
|
-
const {value} = (
|
|
226
|
-
await axios({
|
|
227
|
-
url: createAppiumTestURL(d.sessionId, 'elements'),
|
|
228
|
-
method: POST,
|
|
229
|
-
data: {using: 'name', value: 'foo'},
|
|
230
|
-
})
|
|
231
|
-
).data;
|
|
232
|
-
(Date.now() - start).should.be.above(150);
|
|
233
|
-
value.should.eql(['foo']);
|
|
234
|
-
await endSession(newSession.sessionId);
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
it('should not timeout with commandTimeout of 0', async function () {
|
|
238
|
-
d.newCommandTimeoutMs = 2;
|
|
239
|
-
let newSession = await startTimeoutSession(0);
|
|
240
|
-
|
|
241
|
-
await axios({
|
|
242
|
-
url: createAppiumTestURL(d.sessionId, 'element'),
|
|
243
|
-
method: POST,
|
|
244
|
-
data: {using: 'name', value: 'foo'},
|
|
245
|
-
});
|
|
246
|
-
await B.delay(400);
|
|
247
|
-
const {value} = (
|
|
248
|
-
await axios({
|
|
249
|
-
url: createSessionURL(d.sessionId),
|
|
250
|
-
})
|
|
251
|
-
).data;
|
|
252
|
-
value.platformName.should.equal(defaultCaps.platformName);
|
|
253
|
-
const resp = await endSession(newSession.sessionId);
|
|
254
|
-
should.equal(resp, null);
|
|
255
|
-
|
|
256
|
-
d.newCommandTimeoutMs = 60 * 1000;
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
it('should not timeout if its just the command taking awhile', async function () {
|
|
260
|
-
let newSession = await startTimeoutSession(0.25);
|
|
261
|
-
// XXX: race condition: we must build this URL before ...something happens...
|
|
262
|
-
// which causes `d.sessionId` to be missing
|
|
263
|
-
let sessionURL = createSessionURL(d.sessionId);
|
|
264
|
-
await axios({
|
|
265
|
-
url: createAppiumTestURL(d.sessionId, 'element'),
|
|
266
|
-
method: POST,
|
|
267
|
-
data: {using: 'name', value: 'foo'},
|
|
268
|
-
});
|
|
269
|
-
await B.delay(400);
|
|
270
|
-
const {value} = (
|
|
271
|
-
await axios({
|
|
272
|
-
url: sessionURL,
|
|
273
|
-
validateStatus: null,
|
|
274
|
-
})
|
|
275
|
-
).data;
|
|
276
|
-
value.error.should.equal('invalid session id');
|
|
277
|
-
should.equal(d.sessionId, null);
|
|
278
|
-
const resp = await endSession(newSession.sessionId);
|
|
279
|
-
resp.error.should.equal('invalid session id');
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('should not have a timer running before or after a session', async function () {
|
|
283
|
-
should.not.exist(d.noCommandTimer);
|
|
284
|
-
let newSession = await startTimeoutSession(0.25);
|
|
285
|
-
newSession.sessionId.should.equal(d.sessionId);
|
|
286
|
-
should.exist(d.noCommandTimer);
|
|
287
|
-
await endSession(newSession.sessionId);
|
|
288
|
-
should.not.exist(d.noCommandTimer);
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
describe('settings api', function () {
|
|
293
|
-
before(function () {
|
|
294
|
-
d.settings = new DeviceSettings({ignoreUnimportantViews: false});
|
|
295
|
-
});
|
|
296
|
-
it('should be able to get settings object', function () {
|
|
297
|
-
d.settings.getSettings().ignoreUnimportantViews.should.be.false;
|
|
298
|
-
});
|
|
299
|
-
it('should not reject when `updateSettings` method is not provided', async function () {
|
|
300
|
-
await d.settings.update({ignoreUnimportantViews: true}).should.not.be.rejected;
|
|
301
|
-
});
|
|
302
|
-
it('should reject for invalid update object', async function () {
|
|
303
|
-
await d.settings.update('invalid json').should.eventually.be.rejectedWith('JSON');
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
describe('unexpected exits', function () {
|
|
308
|
-
it('should reject a current command when the driver crashes', async function () {
|
|
309
|
-
d._oldGetStatus = d.getStatus;
|
|
310
|
-
try {
|
|
311
|
-
d.getStatus = async function () {
|
|
312
|
-
await B.delay(5000);
|
|
313
|
-
}.bind(d);
|
|
314
|
-
const reqPromise = axios({
|
|
315
|
-
url: createAppiumTestURL('', 'status'),
|
|
316
|
-
validateStatus: null,
|
|
317
|
-
});
|
|
318
|
-
// make sure that the request gets to the server before our shutdown
|
|
319
|
-
await B.delay(100);
|
|
320
|
-
const shutdownEventPromise = new B((resolve, reject) => {
|
|
321
|
-
setTimeout(
|
|
322
|
-
() =>
|
|
323
|
-
reject(
|
|
324
|
-
new Error(
|
|
325
|
-
'onUnexpectedShutdown event is expected to be fired within 5 seconds timeout'
|
|
326
|
-
)
|
|
327
|
-
),
|
|
328
|
-
5000
|
|
329
|
-
);
|
|
330
|
-
d.onUnexpectedShutdown(resolve);
|
|
331
|
-
});
|
|
332
|
-
d.startUnexpectedShutdown(new Error('Crashytimes'));
|
|
333
|
-
const {value} = (await reqPromise).data;
|
|
334
|
-
value.message.should.contain('Crashytimes');
|
|
335
|
-
await shutdownEventPromise;
|
|
336
|
-
} finally {
|
|
337
|
-
d.getStatus = d._oldGetStatus;
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
describe('event timings', function () {
|
|
343
|
-
it('should not add timings if not using opt-in cap', async function () {
|
|
344
|
-
const session = await startSession(defaultCaps);
|
|
345
|
-
const res = await getSession(session.sessionId);
|
|
346
|
-
should.not.exist(res.events);
|
|
347
|
-
await endSession(session.sessionId);
|
|
348
|
-
});
|
|
349
|
-
it('should add start session timings', async function () {
|
|
350
|
-
const caps = Object.assign({}, defaultCaps, {
|
|
351
|
-
'appium:eventTimings': true,
|
|
352
|
-
});
|
|
353
|
-
const session = await startSession(caps);
|
|
354
|
-
const res = await getSession(session.sessionId);
|
|
355
|
-
should.exist(res.events);
|
|
356
|
-
should.exist(res.events.newSessionRequested);
|
|
357
|
-
should.exist(res.events.newSessionStarted);
|
|
358
|
-
res.events.newSessionRequested[0].should.be.a('number');
|
|
359
|
-
res.events.newSessionStarted[0].should.be.a('number');
|
|
360
|
-
await endSession(session.sessionId);
|
|
361
|
-
});
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
if (DriverClass === BaseDriver) {
|
|
365
|
-
// only run this test on basedriver, not other drivers which also use these tests, since we
|
|
366
|
-
// don't want them to try and start sessions with these random capabilities that are
|
|
367
|
-
// necessary to test the appium options logic
|
|
368
|
-
describe('special appium:options capability', function () {
|
|
369
|
-
it('should be able to start a session with caps held in appium:options', async function () {
|
|
370
|
-
const ret = await startSession({
|
|
371
|
-
platformName: 'iOS',
|
|
372
|
-
[PREFIXED_APPIUM_OPTS_CAP]: {
|
|
373
|
-
platformVersion: '11.4',
|
|
374
|
-
'appium:deviceName': 'iPhone 11',
|
|
375
|
-
},
|
|
376
|
-
});
|
|
377
|
-
d.opts.platformVersion.should.eql('11.4');
|
|
378
|
-
d.opts.deviceName.should.eql('iPhone 11');
|
|
379
|
-
await endSession(ret.sessionId);
|
|
380
|
-
});
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
export default baseDriverE2ETests;
|