Skip to content

Commit 0b76aa5

Browse files
committed
Added improved protocol error handler for main transports
1 parent a65f49e commit 0b76aa5

File tree

6 files changed

+400
-38
lines changed

6 files changed

+400
-38
lines changed

lib/http/response.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ class HttpResponse extends EventEmitter {
102102
};
103103
}
104104

105+
if (result.value && result.value.stacktrace) {
106+
// this is in order to not pollute verbose logs
107+
result.value.stacktrace = '';
108+
}
109+
105110
return result;
106111
}
107112
}

lib/transport/jsonwire.js

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -143,40 +143,52 @@ class JsonWireProtocol extends Transport {
143143
// Error handling
144144
////////////////////////////////////////////////////////////////////////
145145
handleProtocolError(result, response, screenshotContent) {
146-
let errorMessage = response && response.statusCode === 404 ? 'Unknown command' : 'An unknown error has occurred.';
146+
result = result || {};
147+
response = response || {};
148+
149+
const {status = '', value = null, code = '', message = null} = result;
150+
let errorMessage;
151+
let {state = ''} = result;
152+
153+
if (code && message) {
154+
errorMessage = `Error ${code}: ${message}`;
155+
} else {
156+
errorMessage = response.statusCode === 404 ? 'Unknown command' : 'An unknown error has occurred.';
157+
}
147158

148159
if (screenshotContent) {
149160
this.reporter && this.reporter.saveErrorScreenshot(result, screenshotContent);
150161
}
151162

152-
if (result && result.status) {
153-
if (result.value && result.value.message) {
154-
errorMessage = result.value && result.value.message;
155-
} else {
156-
let error = Errors.findErrorById(result.status);
157-
if (error) {
158-
errorMessage = Errors.findErrorById(result.status).message;
159-
}
163+
if (status) {
164+
let error = Errors.findErrorById(status);
165+
if (error) {
166+
errorMessage = Errors.findErrorById(result.status).message;
167+
}
168+
169+
if (value && value.message) {
170+
errorMessage = `${errorMessage}${result.value.message}`;
160171
}
161-
} else if (response && response.statusCode && response.statusMessage) {
172+
} else if (response.statusCode && response.statusMessage) {
162173
errorMessage += ` ${response.statusCode} ${response.statusMessage}`;
163174
}
164175

165-
if (response && response.headers && (response.headers['content-type'] === 'text/html' || response.headers['content-type'] === 'text/plain')) {
176+
if (response.headers && (response.headers['content-type'] === 'text/html' || response.headers['content-type'] === 'text/plain')) {
166177
errorMessage = errorMessage.replace(/(<([^>]+)>)/gi, ''); // strip html tags
167178
}
168179

169-
if (errorMessage.length > 50) {
170-
errorMessage = errorMessage.substr(0, 50) + '...';
180+
if (errorMessage.length > 120) {
181+
errorMessage = errorMessage.substr(0, 120) + '...';
171182
}
172183

173184
return {
174185
status: -1,
175-
state: result.state || '',
176-
value : result && result.value || null,
177-
errorStatus: result && result.status || '',
186+
state,
187+
code,
188+
value,
189+
errorStatus: status,
178190
error : errorMessage,
179-
httpStatusCode: response && response.statusCode
191+
httpStatusCode: response.statusCode || null
180192
};
181193
}
182194

lib/transport/selenium3.js

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ class SeleniumProtocol extends Selenium2 {
88
return MethodMappings;
99
}
1010

11+
get defaultPathPrefix() {
12+
return '/wd/hub';
13+
}
14+
1115
////////////////////////////////////////////////////////////////////
1216
// Elements related
1317
////////////////////////////////////////////////////////////////////
@@ -19,28 +23,58 @@ class SeleniumProtocol extends Selenium2 {
1923
return resultValue.ELEMENT;
2024
}
2125

26+
formatCommandResponseData(result) {
27+
if (!result.value || typeof result.value != 'object') {
28+
return;
29+
}
30+
31+
if (result['[[isNightwatch]]']) {
32+
delete result['[[isNightwatch]]'];
33+
34+
return;
35+
}
36+
37+
if (typeof result.value.stackTrace != 'undefined') {
38+
delete result.value.stackTrace;
39+
}
40+
}
41+
2242
handleProtocolError(result, response, screenshotContent) {
23-
let errorMessage = response && response.statusCode === 404 ? 'Unknown command' : 'An unknown error has occurred.';
43+
result = result || {};
44+
response = response || {};
45+
46+
const {status = '', code = '', message = null, state = '', value = null} = result;
47+
const {statusCode = null} = response;
48+
49+
let errorMessage = response.statusCode === 404 ? 'Unknown command' : 'An unknown error has occurred.';
2450

2551
if (screenshotContent) {
2652
this.reporter && this.reporter.saveErrorScreenshot(result, screenshotContent);
2753
}
2854

29-
if (result && result.value && result.value.message) {
30-
errorMessage = result.value.message;
31-
} else if (result && result.state && WebdriverErrors.Response[result.state]) {
32-
errorMessage = WebdriverErrors.Response[result.state].message;
33-
} else if (response && response.status && response.statusMessage) {
55+
if (code && message) {
56+
errorMessage = `Error ${code}: ${message}`;
57+
} else if (value && value.message) {
58+
errorMessage = '';
59+
if (value.error) {
60+
errorMessage = `${value.error} – `;
61+
}
62+
63+
errorMessage += value.message.split('\n')[0];
64+
} else if (state && WebdriverErrors.Response[state]) {
65+
errorMessage = WebdriverErrors.Response[state].message;
66+
} else if (response.status && response.statusMessage) {
3467
errorMessage += ` ${response.status} ${response.statusMessage}`;
3568
}
3669

3770
return {
3871
status: -1,
39-
state: result && result.state || '',
40-
value : result && result.value || null,
41-
errorStatus: result && result.status || '',
72+
code,
73+
state,
74+
value,
75+
errorStatus: status,
4276
error : errorMessage,
43-
httpStatusCode: response && response.statusCode || -1
77+
httpStatusCode: statusCode
4478
};
4579
}
4680
}

lib/transport/webdriver.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,35 @@ class WebdriverProtocol extends Transport {
4747
}
4848

4949
handleProtocolError(result, response = {}) {
50-
let errorMessage = response && response.statusCode === 404 ? 'Unknown command' : 'An unknown error has occurred.';
50+
result = result || {};
5151

52-
if (result.value && result.value.message) {
53-
errorMessage = result.value.message;
54-
} else if (result.value && result.value.error && this.Errors.Response[result.value.error]) {
55-
errorMessage = this.Errors.Response[result.value.error].message;
56-
} else if (result.error) {
57-
errorMessage = result.error;
52+
const {status = '', value = null, error, code = '', message = null} = result;
53+
const {statusCode = null} = response;
54+
let errorMessage;
55+
56+
// node.js errors
57+
if (code && message) {
58+
errorMessage = `Error ${code}: ${message}`;
59+
} else {
60+
// default error message;
61+
errorMessage = response && response.statusCode === 404 ? 'Unknown command' : 'An unknown error has occurred.';
62+
}
63+
64+
if (value && value.message) {
65+
errorMessage = value.message;
66+
} else if (value && value.error && this.Errors.Response[value.error]) {
67+
errorMessage = this.Errors.Response[value.error].message;
68+
} else if (error) {
69+
errorMessage = error;
5870
}
5971

6072
return {
6173
status: -1,
62-
value : result && result.value || null,
63-
errorStatus: result && result.status || '',
64-
error : errorMessage,
65-
httpStatusCode: response.statusCode
74+
value,
75+
code,
76+
errorStatus: status,
77+
error: errorMessage,
78+
httpStatusCode: statusCode
6679
};
6780
}
6881
}

lib/utils/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ class Utils {
226226
'(events.js:',
227227
'(util.js:',
228228
'(net.js:',
229+
'_http_client.js:',
229230
'process._tickCallback'
230231
])) {
231232
return list;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy