selenium-webdriver 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,8 +23,6 @@ limitations under the License.
23
23
  goog.provide('webdriver.WebElement');
24
24
 
25
25
  goog.require('goog.array');
26
- goog.require('goog.math.Coordinate');
27
- goog.require('goog.math.Size');
28
26
  goog.require('webdriver.By.Locator');
29
27
  goog.require('webdriver.By.Strategy');
30
28
  goog.require('webdriver.Command');
@@ -90,12 +88,9 @@ webdriver.WebElement.UUID_REGEX =
90
88
  webdriver.WebElement.findElement = function(driver, locator) {
91
89
  var webElement = new webdriver.WebElement(driver);
92
90
  locator = webdriver.By.Locator.checkLocator(locator);
93
- var command = new webdriver.Command(webdriver.CommandName.FIND_ELEMENT).
94
- setParameters(locator.type, locator.target).
95
- setSuccessCallback(function(response) {
96
- webElement.getId().setValue(response.value);
97
- });
98
- driver.addCommand(command);
91
+ var command = driver.addCommand(webdriver.CommandName.FIND_ELEMENT).
92
+ setParameters(locator.type, locator.target);
93
+ webElement.getId().setValue(command.getFutureResult());
99
94
  return webElement;
100
95
  };
101
96
 
@@ -113,20 +108,18 @@ webdriver.WebElement.findElement = function(driver, locator) {
113
108
  * @see webdriver.By.Locator.createFromObj
114
109
  */
115
110
  webdriver.WebElement.isElementPresent = function(driver, locator) {
116
- var isPresent = new webdriver.Future(driver);
117
111
  var callback = function(response) {
118
112
  // If returns without an error, element is present.
119
- isPresent.setValue(response.value = !response.isFailure);
113
+ response.value = !response.isFailure;
120
114
  // Go ahead and clear the error.
121
115
  response.isFailure = false;
122
116
  };
123
117
  locator = webdriver.By.Locator.checkLocator(locator);
124
- var command = new webdriver.Command(webdriver.CommandName.FIND_ELEMENT).
118
+ return driver.addCommand(webdriver.CommandName.FIND_ELEMENT).
125
119
  setParameters(locator.type, locator.target).
126
120
  setSuccessCallback(callback).
127
- setFailureCallback(callback);
128
- driver.addCommand(command);
129
- return isPresent;
121
+ setFailureCallback(callback).
122
+ getFutureResult();
130
123
  };
131
124
 
132
125
 
@@ -141,12 +134,11 @@ webdriver.WebElement.isElementPresent = function(driver, locator) {
141
134
  */
142
135
  webdriver.WebElement.findElements = function(driver, locator) {
143
136
  locator = webdriver.By.Locator.checkLocator(locator);
144
- var command = new webdriver.Command(webdriver.CommandName.FIND_ELEMENTS).
137
+ driver.addCommand(webdriver.CommandName.FIND_ELEMENTS).
145
138
  setParameters(locator.type, locator.target).
146
139
  setSuccessCallback(function(response) {
147
- var ids = response.value.split(',');
148
140
  var elements = [];
149
- for (var i = 0, id; id = ids[i]; i++) {
141
+ for (var i = 0, id; id = response.value[i]; i++) {
150
142
  if (id) {
151
143
  var element = new webdriver.WebElement(driver);
152
144
  element.getId().setValue(id);
@@ -155,7 +147,6 @@ webdriver.WebElement.findElements = function(driver, locator) {
155
147
  }
156
148
  response.value = elements;
157
149
  });
158
- driver.addCommand(command);
159
150
  };
160
151
 
161
152
 
@@ -171,24 +162,22 @@ webdriver.WebElement.findElements = function(driver, locator) {
171
162
  * @see webdriver.By.Locator.createFromObj
172
163
  */
173
164
  webdriver.WebElement.prototype.isElementPresent = function(locator) {
174
- var isPresent = new webdriver.Future(this.driver_);
175
165
  var callback = function(response) {
176
166
  // If returns without an error, element is present.
177
- isPresent.setValue(response.value = !response.isFailure);
167
+ response.value = !response.isFailure;
178
168
  // Go ahead and clear the error (if any).
179
169
  response.isFailure = false;
180
170
  };
181
171
  locator = webdriver.By.Locator.checkLocator(locator);
182
- var command = new webdriver.Command(webdriver.CommandName.FIND_CHILD_ELEMENT).
172
+ return this.driver_.addCommand(webdriver.CommandName.FIND_CHILD_ELEMENT).
183
173
  setParameters({
184
174
  'id': this.getId(),
185
175
  'using': locator.type,
186
176
  'value': locator.target
187
177
  }).
188
178
  setSuccessCallback(callback).
189
- setFailureCallback(callback);
190
- this.driver_.addCommand(command);
191
- return isPresent;
179
+ setFailureCallback(callback).
180
+ getFutureResult();
192
181
  };
193
182
 
194
183
 
@@ -206,16 +195,14 @@ webdriver.WebElement.prototype.isElementPresent = function(locator) {
206
195
  webdriver.WebElement.prototype.findElement = function(locator) {
207
196
  var webElement = new webdriver.WebElement(this.driver_);
208
197
  locator = webdriver.By.Locator.checkLocator(locator);
209
- var command = new webdriver.Command(webdriver.CommandName.FIND_CHILD_ELEMENT).
198
+ var command = this.driver_.
199
+ addCommand(webdriver.CommandName.FIND_CHILD_ELEMENT).
210
200
  setParameters({
211
201
  'id': this.getId(),
212
202
  'using': locator.type,
213
203
  'value': locator.target
214
- }).
215
- setSuccessCallback(function(response) {
216
- webElement.getId().setValue(response.value);
217
204
  });
218
- this.driver_.addCommand(command);
205
+ webElement.getId().setValue(command.getFutureResult());
219
206
  return webElement;
220
207
  };
221
208
 
@@ -230,26 +217,23 @@ webdriver.WebElement.prototype.findElement = function(locator) {
230
217
  */
231
218
  webdriver.WebElement.prototype.findElements = function(locator) {
232
219
  locator = webdriver.By.Locator.checkLocator(locator);
233
- var command =
234
- new webdriver.Command(webdriver.CommandName.FIND_CHILD_ELEMENTS).
235
- setParameters({
236
- 'id': this.getId(),
237
- 'using': locator.type,
238
- 'value': locator.target
239
- }).
240
- setSuccessCallback(function(response) {
241
- var ids = response.value.split(',');
242
- var elements = [];
243
- for (var i = 0, id; id = ids[i]; i++) {
244
- if (id) {
245
- var element = new webdriver.WebElement(this.driver_);
246
- element.getId().setValue(id);
247
- elements.push(element);
248
- }
249
- }
250
- response.value = elements;
251
- }, this);
252
- this.driver_.addCommand(command);
220
+ this.driver_.addCommand(webdriver.CommandName.FIND_CHILD_ELEMENTS).
221
+ setParameters({
222
+ 'id': this.getId(),
223
+ 'using': locator.type,
224
+ 'value': locator.target
225
+ }).
226
+ setSuccessCallback(function(response) {
227
+ var elements = [];
228
+ for (var i = 0, id; id = response.value[i]; i++) {
229
+ if (id) {
230
+ var element = new webdriver.WebElement(this.driver_);
231
+ element.getId().setValue(id);
232
+ elements.push(element);
233
+ }
234
+ }
235
+ response.value = elements;
236
+ }, this);
253
237
  };
254
238
 
255
239
 
@@ -278,7 +262,7 @@ webdriver.WebElement.prototype.getId = function() {
278
262
  * @private
279
263
  */
280
264
  webdriver.WebElement.prototype.createCommand_ = function(name) {
281
- return new webdriver.Command(name, this);
265
+ return this.driver_.addCommand(name, this);
282
266
  };
283
267
 
284
268
 
@@ -286,8 +270,7 @@ webdriver.WebElement.prototype.createCommand_ = function(name) {
286
270
  * Adds a command to click on this element.
287
271
  */
288
272
  webdriver.WebElement.prototype.click = function() {
289
- var command = this.createCommand_(webdriver.CommandName.CLICK);
290
- this.driver_.addCommand(command);
273
+ this.createCommand_(webdriver.CommandName.CLICK);
291
274
  };
292
275
 
293
276
 
@@ -343,18 +326,14 @@ webdriver.WebElement.prototype.click = function() {
343
326
  webdriver.WebElement.prototype.sendKeys = function(var_args) {
344
327
  var command = this.createCommand_(webdriver.CommandName.SEND_KEYS);
345
328
  command.setParameters.apply(command, arguments);
346
- this.driver_.addCommand(command);
347
329
  };
348
330
 
349
331
  /**
350
332
  * Queries for the tag/node name of this element.
351
333
  */
352
334
  webdriver.WebElement.prototype.getTagName = function() {
353
- var name = new webdriver.Future(this.driver_);
354
- var command = this.createCommand_(webdriver.CommandName.GET_TAG_NAME).
355
- setSuccessCallback(name.setValueFromResponse, name);
356
- this.driver_.addCommand(command);
357
- return name;
335
+ return this.createCommand_(webdriver.CommandName.GET_TAG_NAME).
336
+ getFutureResult();
358
337
  };
359
338
 
360
339
 
@@ -371,12 +350,9 @@ webdriver.WebElement.prototype.getTagName = function() {
371
350
  * Future.
372
351
  */
373
352
  webdriver.WebElement.prototype.getComputedStyle = function(cssStyleProperty) {
374
- var value = new webdriver.Future(this.driver_);
375
- var command = this.createCommand_(webdriver.CommandName.GET_VALUE_OF_CSS_PROPERTY).
353
+ return this.createCommand_(webdriver.CommandName.GET_VALUE_OF_CSS_PROPERTY).
376
354
  setParameters(cssStyleProperty).
377
- setSuccessCallback(value.setValueFromResponse, value);
378
- this.driver_.addCommand(command);
379
- return value;
355
+ getFutureResult();
380
356
  };
381
357
 
382
358
 
@@ -385,22 +361,9 @@ webdriver.WebElement.prototype.getComputedStyle = function(cssStyleProperty) {
385
361
  * @param {string} attributeName The name of the attribute to query.
386
362
  */
387
363
  webdriver.WebElement.prototype.getAttribute = function(attributeName) {
388
- var value = new webdriver.Future(this.driver_);
389
- var command = this.createCommand_(webdriver.CommandName.GET_ATTRIBUTE).
364
+ return this.createCommand_(webdriver.CommandName.GET_ATTRIBUTE).
390
365
  setParameters(attributeName).
391
- setSuccessCallback(value.setValueFromResponse, value).
392
- // If there is an error b/c the attribute was not found, set value to null
393
- setFailureCallback(function(response) {
394
- // TODO(jmleyba): This error message needs to be consistent for all
395
- // drivers.
396
- if (response.value == 'No match') {
397
- response.isFailure = false;
398
- response.value = null;
399
- value.setValue(null);
400
- }
401
- });
402
- this.driver_.addCommand(command);
403
- return value;
366
+ getFutureResult();
404
367
  };
405
368
 
406
369
 
@@ -409,11 +372,8 @@ webdriver.WebElement.prototype.getAttribute = function(attributeName) {
409
372
  * this instance.
410
373
  */
411
374
  webdriver.WebElement.prototype.getValue = function() {
412
- var value = new webdriver.Future(this.driver_);
413
- var command = this.createCommand_(webdriver.CommandName.GET_VALUE).
414
- setSuccessCallback(value.setValueFromResponse, value);
415
- this.driver_.addCommand(command);
416
- return value;
375
+ return this.createCommand_(webdriver.CommandName.GET_VALUE).
376
+ getFutureResult();
417
377
  };
418
378
 
419
379
 
@@ -422,11 +382,8 @@ webdriver.WebElement.prototype.getValue = function() {
422
382
  * or trailing whitespace.
423
383
  */
424
384
  webdriver.WebElement.prototype.getText = function() {
425
- var text = new webdriver.Future(this.driver_);
426
- var command = this.createCommand_(webdriver.CommandName.GET_TEXT).
427
- setSuccessCallback(text.setValueFromResponse, text);
428
- this.driver_.addCommand(command);
429
- return text;
385
+ return this.createCommand_(webdriver.CommandName.GET_TEXT).
386
+ getFutureResult();
430
387
  };
431
388
 
432
389
 
@@ -434,8 +391,7 @@ webdriver.WebElement.prototype.getText = function() {
434
391
  * Selects this element.
435
392
  */
436
393
  webdriver.WebElement.prototype.setSelected = function() {
437
- var command = this.createCommand_(webdriver.CommandName.SET_SELECTED);
438
- this.driver_.addCommand(command);
394
+ this.createCommand_(webdriver.CommandName.SET_SELECTED);
439
395
  };
440
396
 
441
397
 
@@ -443,31 +399,8 @@ webdriver.WebElement.prototype.setSelected = function() {
443
399
  * @return {webdriver.Future} The size of this element.
444
400
  */
445
401
  webdriver.WebElement.prototype.getSize = function() {
446
- var size = new webdriver.Future(this.driver_);
447
- var command = this.createCommand_(webdriver.CommandName.GET_SIZE).
448
- setSuccessCallback(function(response) {
449
- var wh = response.value.replace(/\s/g, '').split(',');
450
- response.value = new goog.math.Size(wh[0], wh[1]);
451
- size.setValue(response.value);
452
- });
453
- this.driver_.addCommand(command);
454
- return size;
455
- };
456
-
457
-
458
- /**
459
- * Parses a response of the form "$x $y" into a {@code goog.math.Coordinate}
460
- * object.
461
- * @param {webdriver.Future} future The Future to store the parsed result in.
462
- * @param {webdriver.Response} response The response to parse.
463
- * @private
464
- */
465
- webdriver.WebElement.createCoordinatesFromResponse_ = function(future,
466
- response) {
467
- var xy = response.value.replace(/\s/g, '').split(',');
468
- response.value = new goog.math.Coordinate(
469
- Number(xy[0]), Number(xy[1]));
470
- future.setValue(response.value);
402
+ return this.createCommand_(webdriver.CommandName.GET_SIZE).
403
+ getFutureResult();
471
404
  };
472
405
 
473
406
 
@@ -475,32 +408,8 @@ webdriver.WebElement.createCoordinatesFromResponse_ = function(future,
475
408
  * @return {webdriver.Future} The location of this element.
476
409
  */
477
410
  webdriver.WebElement.prototype.getLocation = function() {
478
- var currentLocation = new webdriver.Future(this.driver_);
479
- var command = this.createCommand_(webdriver.CommandName.GET_LOCATION).
480
- setSuccessCallback(
481
- goog.bind(webdriver.WebElement.createCoordinatesFromResponse_, null,
482
- currentLocation));
483
- this.driver_.addCommand(command);
484
- return currentLocation;
485
- };
486
-
487
-
488
- /**
489
- * @param {webdriver.Future} newLocation Future to store the new location in
490
- * when the command is complete.
491
- * @param {number} x Horizontal distance to drag this element.
492
- * @param {number} y Vertical distanct to drag this element.
493
- * @param opt_addToFront
494
- * @private
495
- */
496
- webdriver.WebElement.prototype.addDragAndDropCommand_ = function(
497
- newLocation, x, y, opt_addToFront) {
498
- var command = this.createCommand_(webdriver.CommandName.DRAG_ELEMENT).
499
- setParameters(x, y).
500
- setSuccessCallback(
501
- goog.bind(webdriver.WebElement.createCoordinatesFromResponse_, null,
502
- newLocation));
503
- this.driver_.addCommand(command, opt_addToFront);
411
+ return this.createCommand_(webdriver.CommandName.GET_LOCATION).
412
+ getFutureResult();
504
413
  };
505
414
 
506
415
 
@@ -511,9 +420,9 @@ webdriver.WebElement.prototype.addDragAndDropCommand_ = function(
511
420
  * @return {webdriver.Future} The new location of the element.
512
421
  */
513
422
  webdriver.WebElement.prototype.dragAndDropBy = function(x, y) {
514
- var newLocation = new webdriver.Future(this.driver_);
515
- this.addDragAndDropCommand_(newLocation, x, y);
516
- return newLocation;
423
+ return this.createCommand_(webdriver.CommandName.DRAG_ELEMENT).
424
+ setParameters(x, y).
425
+ getFutureResult();
517
426
  };
518
427
 
519
428
 
@@ -532,13 +441,11 @@ webdriver.WebElement.prototype.dragAndDropTo = function(webElement) {
532
441
 
533
442
  var toLocation = webElement.getLocation();
534
443
  var thisLocation = this.getLocation();
535
- var newLocation = new webdriver.Future(this.driver_);
536
- this.driver_.callFunction(goog.bind(function() {
444
+ return this.driver_.callFunction(function() {
537
445
  var delta = goog.math.Coordinate.difference(
538
446
  toLocation.getValue(), thisLocation.getValue());
539
- this.addDragAndDropCommand_(newLocation, delta.x, delta.y, true);
540
- }, this));
541
- return newLocation;
447
+ return this.dragAndDropBy(delta.x, delta.y);
448
+ }, this);
542
449
  };
543
450
 
544
451
 
@@ -547,15 +454,12 @@ webdriver.WebElement.prototype.dragAndDropTo = function(webElement) {
547
454
  * enabled, as dictated by the {@code disabled} attribute.
548
455
  */
549
456
  webdriver.WebElement.prototype.isEnabled = function() {
550
- var futureValue = new webdriver.Future(this.driver_);
551
- var command = this.createCommand_(webdriver.CommandName.GET_ATTRIBUTE).
457
+ return this.createCommand_(webdriver.CommandName.GET_ATTRIBUTE).
552
458
  setParameters('disabled').
553
459
  setSuccessCallback(function(response) {
554
460
  response.value = !!!response.value;
555
- futureValue.setValue(response.value);
556
- });
557
- this.driver_.addCommand(command);
558
- return futureValue;
461
+ }).
462
+ getFutureResult();
559
463
  };
560
464
 
561
465
 
@@ -563,27 +467,17 @@ webdriver.WebElement.prototype.isEnabled = function() {
563
467
  * Determines if this element is checked or selected; will generate an error if
564
468
  * the DOM element represented by this instance is not an OPTION or checkbox
565
469
  * INPUT element.
566
- * @return {webdriver.Future} Whether this instance is currently checked or
567
- * selected.
470
+ * @return {webdriver.Future} Whether this element is checked or selected.
568
471
  * @private
569
472
  */
570
- webdriver.WebElement.prototype.isCheckedOrSelected_ = function(opt_future,
571
- opt_addToFront) {
572
- var value = opt_future || new webdriver.Future(this.driver_);
573
- var command = this.createCommand_(webdriver.CommandName.GET_TAG_NAME).
574
- setSuccessCallback(function(response) {
575
- var attribute = response.value == 'input' ? 'checked' : 'selected';
576
- var getAttrCommand =
577
- this.createCommand_(webdriver.CommandName.GET_ATTRIBUTE).
578
- setParameters(attribute).
579
- setSuccessCallback(function(response) {
580
- response.value = !!response.value;
581
- value.setValue(response.value);
582
- });
583
- this.driver_.addCommand(getAttrCommand, true);
584
- }, this);
585
- this.driver_.addCommand(command, opt_addToFront);
586
- return value;
473
+ webdriver.WebElement.prototype.isCheckedOrSelected_ = function() {
474
+ return this.driver_.callFunction(function() {
475
+ this.createCommand_(webdriver.CommandName.GET_TAG_NAME);
476
+ return this.driver_.callFunction(function(response) {
477
+ var attribute = response.value == 'input' ? 'checked' : 'selected';
478
+ return this.getAttribute(attribute);
479
+ }, this);
480
+ }, this);
587
481
  };
588
482
 
589
483
 
@@ -610,13 +504,10 @@ webdriver.WebElement.prototype.isChecked = function() {
610
504
  * @return {webdriver.Future} The new checked/selected state of this element.
611
505
  */
612
506
  webdriver.WebElement.prototype.toggle = function() {
613
- var toggleResult = new webdriver.Future(this.driver_);
614
- var command = this.createCommand_(webdriver.CommandName.TOGGLE).
615
- setSuccessCallback(function() {
616
- this.isCheckedOrSelected_(toggleResult, true);
617
- }, this);
618
- this.driver_.addCommand(command);
619
- return toggleResult;
507
+ return this.driver_.callFunction(function() {
508
+ this.createCommand_(webdriver.CommandName.TOGGLE);
509
+ return this.driver_.callFunction(this.isCheckedOrSelected_, this);
510
+ }, this);
620
511
  };
621
512
 
622
513
 
@@ -625,8 +516,7 @@ webdriver.WebElement.prototype.toggle = function() {
625
516
  * will that form.
626
517
  */
627
518
  webdriver.WebElement.prototype.submit = function() {
628
- this.driver_.addCommand(
629
- this.createCommand_(webdriver.CommandName.SUBMIT));
519
+ this.createCommand_(webdriver.CommandName.SUBMIT);
630
520
  };
631
521
 
632
522
 
@@ -635,8 +525,7 @@ webdriver.WebElement.prototype.submit = function() {
635
525
  * will clear its {@code value}.
636
526
  */
637
527
  webdriver.WebElement.prototype.clear = function() {
638
- this.driver_.addCommand(
639
- this.createCommand_(webdriver.CommandName.CLEAR));
528
+ this.createCommand_(webdriver.CommandName.CLEAR);
640
529
  };
641
530
 
642
531
 
@@ -644,18 +533,8 @@ webdriver.WebElement.prototype.clear = function() {
644
533
  * @return {webdriver.Future} Whether this element is currently displayed.
645
534
  */
646
535
  webdriver.WebElement.prototype.isDisplayed = function() {
647
- var futureValue = new webdriver.Future(this.driver_);
648
- var command = this.createCommand_(webdriver.CommandName.IS_DISPLAYED).
649
- setSuccessCallback(function(response) {
650
- // TODO(jmleyba): FF extension should not be returning a string here...
651
- if (goog.isString(response.value)) {
652
- futureValue.setValue(response.value == 'true');
653
- } else {
654
- futureValue.setValue(response.value);
655
- }
656
- });
657
- this.driver_.addCommand(command);
658
- return futureValue;
536
+ return this.createCommand_(webdriver.CommandName.IS_DISPLAYED).
537
+ getFutureResult();
659
538
  };
660
539
 
661
540