selenium-webdriver 0.0.8 → 0.0.9
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.
- data/chrome/src/extension/background.js +975 -943
- data/chrome/src/extension/content_script.js +34 -5
- data/chrome/src/extension/utils.js +31 -10
- data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +10 -2
- data/common/src/js/abstractcommandprocessor.js +25 -19
- data/common/src/js/command.js +4 -68
- data/common/src/js/future.js +5 -1
- data/common/src/js/jsunit.js +40 -0
- data/common/src/js/localcommandprocessor.js +20 -15
- data/common/src/js/testcase.js +217 -0
- data/common/src/js/webdriver.js +146 -80
- data/common/src/js/webelement.js +49 -127
- data/common/src/rb/lib/selenium/webdriver/child_process.rb +12 -6
- data/firefox/src/extension/components/badCertListener.js +1 -1
- data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/prebuilt/Win32/Release/webdriver-ie-test.dll +0 -0
- data/jobbie/prebuilt/Win32/Release/webdriver-ie.dll +0 -0
- data/jobbie/prebuilt/x64/Release/webdriver-ie-test.dll +0 -0
- data/jobbie/prebuilt/x64/Release/webdriver-ie.dll +0 -0
- metadata +8 -4
- data/common/src/js/logging.js +0 -249
- data/common/src/js/testrunner.js +0 -598
|
@@ -77,11 +77,16 @@ function parsePortMessage(message) {
|
|
|
77
77
|
element.scrollIntoView(true);
|
|
78
78
|
//TODO: Work out a way of firing events,
|
|
79
79
|
//now that synthesising them gives appendMessage errors
|
|
80
|
+
console.log("mouse downing");
|
|
80
81
|
Utils.fireMouseEventOn(element, "mousedown");
|
|
82
|
+
console.log("mouse up");
|
|
81
83
|
Utils.fireMouseEventOn(element, "mouseup");
|
|
84
|
+
console.log("mouse click");
|
|
82
85
|
Utils.fireMouseEventOn(element, "click");
|
|
86
|
+
|
|
83
87
|
if (element.click) {
|
|
84
|
-
|
|
88
|
+
console.log("click");
|
|
89
|
+
execute("try { arguments[0].click(); } catch(e){}", {type: "ELEMENT", value: getElementId_(element)});
|
|
85
90
|
}
|
|
86
91
|
response.value = {statusCode: 0};
|
|
87
92
|
break;
|
|
@@ -535,6 +540,23 @@ function internalGetElement(elementIdAsString) {
|
|
|
535
540
|
}
|
|
536
541
|
}
|
|
537
542
|
|
|
543
|
+
/**
|
|
544
|
+
* Given an element, returning the index that can be used to locate it
|
|
545
|
+
*
|
|
546
|
+
* @param element the element to look up the internal ID of
|
|
547
|
+
* @return A positive integer on success or -1 otherwise
|
|
548
|
+
*/
|
|
549
|
+
function getElementId_(element) {
|
|
550
|
+
var length = ChromeDriverContentScript.internalElementArray.length;
|
|
551
|
+
for (var i = 0; i < length; i++) {
|
|
552
|
+
if (ChromeDriverContentScript.internalElementArray[i] === element) {
|
|
553
|
+
return i;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
return -1;
|
|
558
|
+
}
|
|
559
|
+
|
|
538
560
|
/**
|
|
539
561
|
* Ensures the passed element is in view, so that the native click event can be sent
|
|
540
562
|
* @return object to send back to background page to trigger a native click
|
|
@@ -763,6 +785,8 @@ function toggleElement(element) {
|
|
|
763
785
|
} catch (e) {
|
|
764
786
|
return e;
|
|
765
787
|
}
|
|
788
|
+
console.log("New value: " + newValue);
|
|
789
|
+
|
|
766
790
|
if (changed) {
|
|
767
791
|
//TODO: Work out a way of firing events,
|
|
768
792
|
//now that synthesising them gives appendMessage errors
|
|
@@ -842,9 +866,10 @@ function parseWrappedArguments(argument) {
|
|
|
842
866
|
* We can't share objects between content script and page, so have to wrap up arguments as JSON
|
|
843
867
|
* @param script script to execute as a string
|
|
844
868
|
* @param passedArgs array of arguments to pass to the script
|
|
869
|
+
* @param callback function to call when the result is returned
|
|
845
870
|
*/
|
|
846
|
-
function
|
|
847
|
-
console.log("
|
|
871
|
+
function execute_(script, passedArgs, callback) {
|
|
872
|
+
console.log("executing " + script + ", args: " + JSON.stringify(passedArgs));
|
|
848
873
|
var func = "function(){" + script + "}";
|
|
849
874
|
var args = [];
|
|
850
875
|
for (var i = 0; i < passedArgs.length; ++i) {
|
|
@@ -899,11 +924,15 @@ function execute(script, passedArgs) {
|
|
|
899
924
|
'}' +
|
|
900
925
|
'document.getElementsByTagName("script")[document.getElementsByTagName("script").length - 1].dispatchEvent(e);' +
|
|
901
926
|
'document.getElementsByTagName("html")[0].removeChild(document.getElementsByTagName("script")[document.getElementsByTagName("script").length - 1]);';
|
|
902
|
-
scriptTag.addEventListener('DOMAttrModified',
|
|
927
|
+
scriptTag.addEventListener('DOMAttrModified', callback, false);
|
|
903
928
|
console.log("Injecting script element");
|
|
904
929
|
ChromeDriverContentScript.currentDocument.getElementsByTagName("html")[0].appendChild(scriptTag);
|
|
905
930
|
}
|
|
906
931
|
|
|
932
|
+
function execute(script, passedArgs) {
|
|
933
|
+
execute_(script, passedArgs, returnFromJavascriptInPage);
|
|
934
|
+
}
|
|
935
|
+
|
|
907
936
|
function parseReturnValueFromScript(result) {
|
|
908
937
|
console.log("Parsing: " + JSON.stringify(result));
|
|
909
938
|
var value = {"type":"NULL"};
|
|
@@ -944,7 +973,7 @@ function returnFromJavascriptInPage(e) {
|
|
|
944
973
|
console.log("Result was: " + e.newValue.value);
|
|
945
974
|
var result = JSON.parse(e.newValue).value;
|
|
946
975
|
var value = parseReturnValueFromScript(result);
|
|
947
|
-
console.log("
|
|
976
|
+
console.log("Return value: " + JSON.stringify(value));
|
|
948
977
|
ChromeDriverContentScript.port.postMessage({sequenceNumber: ChromeDriverContentScript.currentSequenceNumber, response: {response: "execute", value: {statusCode: 0, value: value}}});
|
|
949
978
|
}
|
|
950
979
|
|
|
@@ -150,13 +150,11 @@ Utils.getStyleProperty = function(node, propertyName) {
|
|
|
150
150
|
function collapseWhitespace(textSoFar) {
|
|
151
151
|
return textSoFar.replace(/\s+/g, " ");
|
|
152
152
|
}
|
|
153
|
-
;
|
|
154
153
|
|
|
155
154
|
function getPreformattedText(node) {
|
|
156
155
|
var textToAdd = "";
|
|
157
156
|
return getTextFromNode(node, "", textToAdd, true)[1];
|
|
158
157
|
}
|
|
159
|
-
;
|
|
160
158
|
|
|
161
159
|
function isWhiteSpace(character) {
|
|
162
160
|
return character == '\n' || character == ' ' || character == '\t' || character == '\r';
|
|
@@ -177,9 +175,19 @@ Utils.getText = function(element) {
|
|
|
177
175
|
};
|
|
178
176
|
|
|
179
177
|
Utils.fireHtmlEvent = function(element, eventName) {
|
|
180
|
-
var
|
|
181
|
-
|
|
182
|
-
|
|
178
|
+
var args = [
|
|
179
|
+
{type: "ELEMENT", value: getElementId_(element)},
|
|
180
|
+
{type: "STRING", value: eventName}
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
// We need to do this because event handlers refer to functions that
|
|
184
|
+
// the content script can't reah. See:
|
|
185
|
+
// http://code.google.com/p/chromium/issues/detail?id=29071
|
|
186
|
+
var script = "var e = document.createEvent('HTMLEvents'); "
|
|
187
|
+
+ "e.initEvent(arguments[1], true, true); "
|
|
188
|
+
+ "arguments[0].dispatchEvent(e);";
|
|
189
|
+
|
|
190
|
+
execute_(script, args, function(){});
|
|
183
191
|
};
|
|
184
192
|
|
|
185
193
|
|
|
@@ -188,9 +196,22 @@ Utils.fireMouseEventOn = function(element, eventName) {
|
|
|
188
196
|
};
|
|
189
197
|
|
|
190
198
|
Utils.triggerMouseEvent = function(element, eventType, clientX, clientY) {
|
|
191
|
-
var
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
199
|
+
var args = [
|
|
200
|
+
{type: "ELEMENT", value: getElementId_(element)},
|
|
201
|
+
{type: "STRING", value: eventType},
|
|
202
|
+
{type: "NUMBER", value: clientX},
|
|
203
|
+
{type: "NUMBER", value: clientY}
|
|
204
|
+
];
|
|
205
|
+
|
|
206
|
+
// We need to do this because event handlers refer to functions that
|
|
207
|
+
// the content script can't reah. See:
|
|
208
|
+
// http://code.google.com/p/chromium/issues/detail?id=29071
|
|
209
|
+
var script =
|
|
210
|
+
"var event = arguments[0].ownerDocument.createEvent('MouseEvents'); "
|
|
211
|
+
+ "var view = arguments[0].ownerDocument.defaultView; "
|
|
212
|
+
+ "event.initMouseEvent(arguments[1], true, true, view, 1, 0, 0, arguments[2], arguments[3], false, false, false, false, 0, arguments[0]);"
|
|
213
|
+
+ " arguments[0].dispatchEvent(event);";
|
|
214
|
+
|
|
215
|
+
execute_(script, args, function(){});
|
|
196
216
|
};
|
|
217
|
+
|
|
@@ -56,8 +56,12 @@ module Selenium
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def quit
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
begin
|
|
60
|
+
execute :request => 'quit'
|
|
61
|
+
rescue IOError
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
@launcher.kill
|
|
61
65
|
@executor.close
|
|
62
66
|
end
|
|
63
67
|
|
|
@@ -92,6 +96,7 @@ module Selenium
|
|
|
92
96
|
:script => script,
|
|
93
97
|
:args => typed_args
|
|
94
98
|
|
|
99
|
+
return if resp.nil?
|
|
95
100
|
unwrap_script_argument resp
|
|
96
101
|
end
|
|
97
102
|
|
|
@@ -310,7 +315,10 @@ module Selenium
|
|
|
310
315
|
private
|
|
311
316
|
|
|
312
317
|
def execute(command)
|
|
318
|
+
puts "--> #{command.inspect}" if $DEBUG
|
|
313
319
|
resp = raw_execute command
|
|
320
|
+
puts "<-- #{resp.inspect}" if $DEBUG
|
|
321
|
+
|
|
314
322
|
code = resp['statusCode']
|
|
315
323
|
if e = Error.for_code(code)
|
|
316
324
|
msg = resp['value']['message'] if resp['value']
|
|
@@ -26,9 +26,9 @@ goog.require('goog.Disposable');
|
|
|
26
26
|
goog.require('goog.array');
|
|
27
27
|
goog.require('goog.object');
|
|
28
28
|
goog.require('webdriver.CommandName');
|
|
29
|
-
goog.require('webdriver.Context');
|
|
30
29
|
goog.require('webdriver.Future');
|
|
31
30
|
goog.require('webdriver.Response');
|
|
31
|
+
goog.require('webdriver.WebElement');
|
|
32
32
|
goog.require('webdriver.timing');
|
|
33
33
|
|
|
34
34
|
|
|
@@ -57,11 +57,14 @@ webdriver.AbstractCommandProcessor.resolveFutureParams_ = function(
|
|
|
57
57
|
function getValue(obj) {
|
|
58
58
|
if (obj instanceof webdriver.Future) {
|
|
59
59
|
return obj.getValue();
|
|
60
|
-
} else if (goog.isFunction(obj)
|
|
60
|
+
} else if (goog.isFunction(obj) ||
|
|
61
|
+
obj instanceof webdriver.WebElement) {
|
|
61
62
|
return obj;
|
|
62
63
|
} else if (goog.isObject(obj)) {
|
|
63
64
|
goog.object.forEach(obj, function(value, key) {
|
|
64
|
-
|
|
65
|
+
if (value instanceof webdriver.Future) {
|
|
66
|
+
obj[key] = value.getValue();
|
|
67
|
+
}
|
|
65
68
|
});
|
|
66
69
|
}
|
|
67
70
|
return obj;
|
|
@@ -80,36 +83,41 @@ webdriver.AbstractCommandProcessor.resolveFutureParams_ = function(
|
|
|
80
83
|
/**
|
|
81
84
|
* Executes a command.
|
|
82
85
|
* @param {webdriver.Command} command The command to execute.
|
|
83
|
-
* @param {string} sessionId The current session ID.
|
|
84
|
-
* @param {webdriver.Context} context The context to execute the command in.
|
|
85
86
|
*/
|
|
86
|
-
webdriver.AbstractCommandProcessor.prototype.execute = function(command
|
|
87
|
-
|
|
88
|
-
context) {
|
|
87
|
+
webdriver.AbstractCommandProcessor.prototype.execute = function(command) {
|
|
88
|
+
var driver = command.getDriver();
|
|
89
89
|
webdriver.AbstractCommandProcessor.resolveFutureParams_(command);
|
|
90
|
-
|
|
90
|
+
var parameters = command.getParameters();
|
|
91
|
+
switch (command.getName()) {
|
|
91
92
|
case webdriver.CommandName.SLEEP:
|
|
92
|
-
var ms =
|
|
93
|
+
var ms = parameters[0];
|
|
93
94
|
webdriver.timing.setTimeout(function() {
|
|
94
|
-
command.setResponse(new webdriver.Response(
|
|
95
|
+
command.setResponse(new webdriver.Response(
|
|
96
|
+
false, driver.getContext(), ms));
|
|
95
97
|
}, ms);
|
|
96
98
|
break;
|
|
97
99
|
|
|
98
100
|
case webdriver.CommandName.WAIT:
|
|
99
101
|
case webdriver.CommandName.FUNCTION:
|
|
100
102
|
try {
|
|
101
|
-
var
|
|
102
|
-
|
|
103
|
+
var fn = parameters[0];
|
|
104
|
+
var selfObj = parameters[1];
|
|
105
|
+
var args = parameters[2];
|
|
106
|
+
var result = fn.apply(selfObj, args);
|
|
107
|
+
command.setResponse(new webdriver.Response(
|
|
108
|
+
false, driver.getContext(), result));
|
|
103
109
|
} catch (ex) {
|
|
104
|
-
command.setResponse(new webdriver.Response(
|
|
110
|
+
command.setResponse(new webdriver.Response(
|
|
111
|
+
true, driver.getContext(), null, ex));
|
|
105
112
|
}
|
|
106
113
|
break;
|
|
107
114
|
|
|
108
115
|
default:
|
|
109
116
|
try {
|
|
110
|
-
this.
|
|
117
|
+
this.dispatchDriverCommand(command);
|
|
111
118
|
} catch (ex) {
|
|
112
|
-
command.setResponse(new webdriver.Response(
|
|
119
|
+
command.setResponse(new webdriver.Response(
|
|
120
|
+
true, driver.getContext(), null, ex));
|
|
113
121
|
}
|
|
114
122
|
break;
|
|
115
123
|
}
|
|
@@ -120,9 +128,7 @@ webdriver.AbstractCommandProcessor.prototype.execute = function(command,
|
|
|
120
128
|
* Sends a command to be executed by a browser driver. This method must be
|
|
121
129
|
* implemented by each subclass.
|
|
122
130
|
* @param {webdriver.Command} command The command to execute.
|
|
123
|
-
* @param {string} sessionId The current session ID.
|
|
124
|
-
* @param {webdriver.Context} context The context to execute the command in.
|
|
125
131
|
* @protected
|
|
126
132
|
*/
|
|
127
|
-
webdriver.AbstractCommandProcessor.prototype.
|
|
133
|
+
webdriver.AbstractCommandProcessor.prototype.dispatchDriverCommand =
|
|
128
134
|
goog.abstractMethod;
|
data/common/src/js/command.js
CHANGED
|
@@ -79,24 +79,6 @@ webdriver.Command = function(driver, name, opt_element) {
|
|
|
79
79
|
*/
|
|
80
80
|
this.parameters = [];
|
|
81
81
|
|
|
82
|
-
/**
|
|
83
|
-
* Callback for when the command processor successfully finishes this command.
|
|
84
|
-
* The result of this function is included in the final result of the command.
|
|
85
|
-
* @type {?function}
|
|
86
|
-
*/
|
|
87
|
-
this.onSuccessCallbackFn = null;
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Callback for when the command processor fails to successfully finish a
|
|
91
|
-
* command. The function should take a single argument, the
|
|
92
|
-
* {@code webdriver.Response} from the command processor. The response may be
|
|
93
|
-
* modified (for example, to turn an expect failure into a success). If the
|
|
94
|
-
* error state is cleared, the {@code onSucessCallbackFn} will still not be
|
|
95
|
-
* called.
|
|
96
|
-
* @type {?function}
|
|
97
|
-
*/
|
|
98
|
-
this.onFailureCallbackFn = null;
|
|
99
|
-
|
|
100
82
|
/**
|
|
101
83
|
* The response to this command.
|
|
102
84
|
* @type {?webdriver.Response}
|
|
@@ -123,8 +105,6 @@ webdriver.Command.prototype.disposeInternal = function() {
|
|
|
123
105
|
delete this.name;
|
|
124
106
|
delete this.element;
|
|
125
107
|
delete this.parameters;
|
|
126
|
-
delete this.onSuccessCallbackFn;
|
|
127
|
-
delete this.onFailureCallbackFn;
|
|
128
108
|
delete this.response;
|
|
129
109
|
};
|
|
130
110
|
|
|
@@ -180,35 +160,10 @@ webdriver.Command.prototype.setParameters = function(var_args) {
|
|
|
180
160
|
|
|
181
161
|
|
|
182
162
|
/**
|
|
183
|
-
*
|
|
184
|
-
* command processor successfully runs this command. This function is considered
|
|
185
|
-
* part of the command and any errors will cause the command as a whole to fail.
|
|
186
|
-
* @param {function} callbackFn The function to call on success.
|
|
187
|
-
* @param {Object} opt_selfObj The object in whose context to execute the
|
|
188
|
-
* function.
|
|
163
|
+
* @return {Array.<*>} The parameters to send with this command.
|
|
189
164
|
*/
|
|
190
|
-
webdriver.Command.prototype.
|
|
191
|
-
|
|
192
|
-
if (callbackFn) {
|
|
193
|
-
this.onSuccessCallbackFn = goog.bind(callbackFn, opt_selfObj);
|
|
194
|
-
}
|
|
195
|
-
return this;
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Set the function to call with the {@code webdriver.Response} when the
|
|
201
|
-
* command processor encounters an error while executing this command.
|
|
202
|
-
* @param {function} callbackFn The function to call on failure.
|
|
203
|
-
* @param {Object} opt_selfObj The object in whose context to execute the
|
|
204
|
-
* function.
|
|
205
|
-
*/
|
|
206
|
-
webdriver.Command.prototype.setFailureCallback = function(callbackFn,
|
|
207
|
-
opt_selfObj) {
|
|
208
|
-
if (callbackFn) {
|
|
209
|
-
this.onFailureCallbackFn = goog.bind(callbackFn, opt_selfObj);
|
|
210
|
-
}
|
|
211
|
-
return this;
|
|
165
|
+
webdriver.Command.prototype.getParameters = function() {
|
|
166
|
+
return this.parameters;
|
|
212
167
|
};
|
|
213
168
|
|
|
214
169
|
|
|
@@ -231,26 +186,7 @@ webdriver.Command.prototype.setResponse = function(response) {
|
|
|
231
186
|
return;
|
|
232
187
|
}
|
|
233
188
|
this.response = response;
|
|
234
|
-
|
|
235
|
-
var sandbox = goog.bind(function(fn) {
|
|
236
|
-
try {
|
|
237
|
-
fn.call(this, this.response);
|
|
238
|
-
} catch (ex) {
|
|
239
|
-
this.response.isFailure = true;
|
|
240
|
-
this.response.errors.push(ex);
|
|
241
|
-
}
|
|
242
|
-
}, this);
|
|
243
|
-
|
|
244
|
-
if (!this.response.errors.length) {
|
|
245
|
-
if (this.response.isFailure &&
|
|
246
|
-
goog.isFunction(this.onFailureCallbackFn)) {
|
|
247
|
-
sandbox(this.onFailureCallbackFn);
|
|
248
|
-
} else if (!this.response.isFailure &&
|
|
249
|
-
goog.isFunction(this.onSuccessCallbackFn)) {
|
|
250
|
-
sandbox(this.onSuccessCallbackFn);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
189
|
+
this.driver_.setContext(this.response.context);
|
|
254
190
|
if (!this.response.isFailure) {
|
|
255
191
|
this.futureResult_.setValue(this.response.value);
|
|
256
192
|
} else {
|
data/common/src/js/future.js
CHANGED
|
@@ -116,7 +116,11 @@ webdriver.Future.prototype.setValue = function(value) {
|
|
|
116
116
|
}
|
|
117
117
|
if (value instanceof webdriver.Future) {
|
|
118
118
|
if (value.isSet()) {
|
|
119
|
-
|
|
119
|
+
value = value.getValue();
|
|
120
|
+
this.value_ = value;
|
|
121
|
+
goog.array.forEach(this.linkedFutures_, function(future) {
|
|
122
|
+
future.setValue(value);
|
|
123
|
+
});
|
|
120
124
|
} else {
|
|
121
125
|
value.linkedFutures_.push(this);
|
|
122
126
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** @license
|
|
2
|
+
Copyright 2007-2009 WebDriver committers
|
|
3
|
+
Copyright 2007-2009 Google Inc.
|
|
4
|
+
|
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
you may not use this file except in compliance with the License.
|
|
7
|
+
You may obtain a copy of the License at
|
|
8
|
+
|
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
|
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
See the License for the specific language governing permissions and
|
|
15
|
+
limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @fileoverview File to include for turnning any HTML page into a WebDriver
|
|
20
|
+
* JSUnit test suite by configuring an onload listener to the body that will
|
|
21
|
+
* instantiate and start the test runner.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
goog.provide('webdriver.jsunit');
|
|
25
|
+
|
|
26
|
+
goog.require('goog.testing.jsunit');
|
|
27
|
+
goog.require('webdriver.TestCase');
|
|
28
|
+
goog.require('webdriver.asserts');
|
|
29
|
+
goog.require('webdriver.factory');
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
(function() {
|
|
33
|
+
window.onload = function() {
|
|
34
|
+
var test = new webdriver.TestCase(document.title,
|
|
35
|
+
webdriver.factory.createLocalWebDriver);
|
|
36
|
+
test.autoDiscoverTests();
|
|
37
|
+
G_testRunner.initialize(test);
|
|
38
|
+
G_testRunner.execute(test);
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
@@ -24,6 +24,7 @@ limitations under the License.
|
|
|
24
24
|
goog.provide('webdriver.LocalCommandProcessor');
|
|
25
25
|
|
|
26
26
|
goog.require('goog.array');
|
|
27
|
+
goog.require('goog.debug.Logger');
|
|
27
28
|
goog.require('goog.dom');
|
|
28
29
|
goog.require('goog.events');
|
|
29
30
|
goog.require('goog.json');
|
|
@@ -123,9 +124,8 @@ webdriver.LocalCommandProcessor.onResponse_ = function(command, e) {
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
var rawResponse = goog.json.parse(jsonResponse);
|
|
126
|
-
webdriver.
|
|
127
|
-
'receiving:\n' +
|
|
128
|
-
webdriver.logging.describe(rawResponse, ' '));
|
|
127
|
+
goog.debug.Logger.getLogger('webdriver.LocalCommandProcessor').fine(
|
|
128
|
+
'receiving:\n' + jsonResponse);
|
|
129
129
|
|
|
130
130
|
var response = new webdriver.Response(
|
|
131
131
|
rawResponse['isError'],
|
|
@@ -144,29 +144,34 @@ webdriver.LocalCommandProcessor.onResponse_ = function(command, e) {
|
|
|
144
144
|
/**
|
|
145
145
|
* @override
|
|
146
146
|
*/
|
|
147
|
-
webdriver.LocalCommandProcessor.prototype.
|
|
148
|
-
command
|
|
149
|
-
if (command.
|
|
150
|
-
command.
|
|
147
|
+
webdriver.LocalCommandProcessor.prototype.dispatchDriverCommand = function(
|
|
148
|
+
command) {
|
|
149
|
+
if (command.getName() == webdriver.CommandName.SEND_KEYS) {
|
|
150
|
+
command.setParameters(command.getParameters().join(''));
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
var jsonCommand = {
|
|
154
|
-
'commandName': command.
|
|
155
|
-
'context':
|
|
156
|
-
'parameters': command.
|
|
154
|
+
'commandName': command.getName(),
|
|
155
|
+
'context': command.getDriver().getContext().toString(),
|
|
156
|
+
'parameters': command.getParameters()
|
|
157
157
|
};
|
|
158
158
|
|
|
159
159
|
if (command.element) {
|
|
160
|
-
|
|
160
|
+
try {
|
|
161
|
+
jsonCommand['elementId'] = command.element.getId().getValue();
|
|
162
|
+
} catch (ex) {
|
|
163
|
+
window.console.dir(command);
|
|
164
|
+
throw ex;
|
|
165
|
+
}
|
|
161
166
|
}
|
|
162
167
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
jsonCommand = goog.json.serialize(jsonCommand);
|
|
169
|
+
goog.debug.Logger.getLogger('webdriver.LocalCommandProcessor').fine(
|
|
170
|
+
'sending:\n' + jsonCommand);
|
|
166
171
|
|
|
167
172
|
this.documentElement_.setAttribute(
|
|
168
173
|
webdriver.LocalCommandProcessor.MessageAttribute_.COMMAND,
|
|
169
|
-
|
|
174
|
+
jsonCommand);
|
|
170
175
|
|
|
171
176
|
goog.events.listen(this.documentElement_,
|
|
172
177
|
webdriver.LocalCommandProcessor.EventType_.RESPONSE,
|