@@ -346,7 +346,23 @@ Protractor.prototype.waitForAngular = function() {
346
346
*
347
347
* @param {webdriver.WebElement } element
348
348
*/
349
- var wrapWebElement = function ( element ) {
349
+ Protractor . prototype . wrapWebElement = function ( element ) {
350
+ var thisPtor = this ;
351
+ // Before any of these WebElement functions, Protractor will wait to make sure
352
+ // Angular is synched up.
353
+ var functionsToSync = [
354
+ 'click' , 'sendKeys' , 'getTagName' , 'getCssValue' , 'getAttribute' , 'getText' ,
355
+ 'getSize' , 'getLocation' , 'isEnabled' , 'isSelected' , 'submit' , 'clear' ,
356
+ 'isDisplayed' , 'getOuterHtml' , 'getInnerHtml' ] ;
357
+ var originalFns = { } ;
358
+ functionsToSync . forEach ( function ( name ) {
359
+ originalFns [ name ] = element [ name ] ;
360
+ element [ name ] = function ( ) {
361
+ thisPtor . waitForAngular ( ) ;
362
+ return originalFns [ name ] . apply ( element , arguments ) ;
363
+ }
364
+ } ) ;
365
+
350
366
var originalFindElement = element . findElement ;
351
367
var originalFindElements = element . findElements ;
352
368
@@ -355,6 +371,7 @@ var wrapWebElement = function(element) {
355
371
* @return {!webdriver.WebElement }
356
372
*/
357
373
element . findElement = function ( locator , varArgs ) {
374
+ thisPtor . waitForAngular ( ) ;
358
375
if ( locator . findOverride ) {
359
376
return locator . findOverride ( element . getDriver ( ) , element ) ;
360
377
}
@@ -367,6 +384,7 @@ var wrapWebElement = function(element) {
367
384
* array of the located {@link webdriver.WebElement}s.
368
385
*/
369
386
element . findElements = function ( locator , varArgs ) {
387
+ thisPtor . waitForAngular ( ) ;
370
388
if ( locator . findArrayOverride ) {
371
389
return locator . findArrayOverride ( element . getDriver ( ) , element ) ;
372
390
}
@@ -384,8 +402,8 @@ var wrapWebElement = function(element) {
384
402
* will be returned as a WebElement.
385
403
*/
386
404
element . evaluate = function ( expression ) {
387
- // put into clientSideScripts
388
- // Should this be a function of WebElement? (yes)
405
+ // TODO: put into clientSideScripts
406
+ thisPtor . waitForAngular ( ) ;
389
407
return element . getDriver ( ) . executeScript ( function ( ) {
390
408
var element = arguments [ 0 ] ;
391
409
var expression = arguments [ 1 ] ;
@@ -405,9 +423,9 @@ var wrapWebElement = function(element) {
405
423
Protractor . prototype . findElement = function ( locator , varArgs ) {
406
424
this . waitForAngular ( ) ;
407
425
if ( locator . findOverride ) {
408
- return wrapWebElement ( locator . findOverride ( this . driver ) ) ;
426
+ return this . wrapWebElement ( locator . findOverride ( this . driver ) ) ;
409
427
}
410
- return wrapWebElement ( this . driver . findElement ( locator , varArgs ) ) ;
428
+ return this . wrapWebElement ( this . driver . findElement ( locator , varArgs ) ) ;
411
429
} ;
412
430
413
431
/**
@@ -417,11 +435,12 @@ Protractor.prototype.findElement = function(locator, varArgs) {
417
435
* array of the located {@link webdriver.WebElement}s.
418
436
*/
419
437
Protractor . prototype . findElements = function ( locator , varArgs ) {
438
+ var self = this ;
420
439
this . waitForAngular ( ) ;
421
440
if ( locator . findArrayOverride ) {
422
441
return locator . findArrayOverride ( this . driver ) . then ( function ( elems ) {
423
442
for ( var i = 0 ; i < elems . length ; ++ i ) {
424
- wrapWebElement ( elems [ i ] ) ;
443
+ self . wrapWebElement ( elems [ i ] ) ;
425
444
}
426
445
return elems ;
427
446
} ) ;
0 commit comments