@@ -49,17 +49,29 @@ var mixin = function(to, from, fnName, setupFn) {
49
49
*
50
50
* @private
51
51
* @param {Protractor } ptor
52
+ * @param {=Array.<webdriver.Locator> } opt_usingChain
52
53
* @return {function(webdriver.Locator): ElementFinder }
53
54
*/
54
- var buildElementHelper = function ( ptor ) {
55
+ var buildElementHelper = function ( ptor , opt_usingChain ) {
56
+ var usingChain = opt_usingChain || [ ] ;
57
+ var using = function ( ) {
58
+ var base = ptor ;
59
+ for ( var i = 0 ; i < usingChain . length ; ++ i ) {
60
+ base = base . findElement ( usingChain [ i ] ) ;
61
+ }
62
+ return base ;
63
+ }
64
+
55
65
var element = function ( locator ) {
56
66
var elementFinder = { } ;
67
+
57
68
var webElementFns = WEB_ELEMENT_FUNCTIONS . concat (
58
69
[ 'findElements' , 'isElementPresent' , 'evaluate' , '$$' ] ) ;
59
70
webElementFns . forEach ( function ( fnName ) {
60
71
elementFinder [ fnName ] = function ( ) {
61
72
var args = arguments ;
62
- return ptor . findElement ( locator ) . then ( function ( element ) {
73
+
74
+ return using ( ) . findElement ( locator ) . then ( function ( element ) {
63
75
return element [ fnName ] . apply ( element , args ) ;
64
76
} , function ( error ) {
65
77
throw error ;
@@ -70,22 +82,23 @@ var buildElementHelper = function(ptor) {
70
82
// This is a special case since it doesn't return a promise, instead it
71
83
// returns a WebElement.
72
84
elementFinder . findElement = function ( subLocator ) {
73
- return ptor . findElement ( locator ) . findElement ( subLocator ) ;
74
- } ;
75
-
76
- // This is a special case since it doesn't return a promise, instead it
77
- // returns a WebElement.
78
- elementFinder . $ = function ( cssSelector ) {
79
- return ptor . findElement ( locator ) .
80
- findElement ( webdriver . By . css ( cssSelector ) ) ;
85
+ return using ( ) . findElement ( locator ) . findElement ( subLocator ) ;
81
86
} ;
82
87
83
88
elementFinder . find = function ( ) {
84
- return ptor . findElement ( locator ) ;
89
+ return using ( ) . findElement ( locator ) ;
85
90
} ;
86
91
87
92
elementFinder . isPresent = function ( ) {
88
- return ptor . isElementPresent ( locator ) ;
93
+ return using ( ) . isElementPresent ( locator ) ;
94
+ } ;
95
+
96
+ elementFinder . element =
97
+ buildElementHelper ( ptor , usingChain . concat ( locator ) ) ;
98
+
99
+ elementFinder . $ = function ( cssSelector ) {
100
+ return buildElementHelper ( ptor , usingChain . concat ( locator ) ) (
101
+ webdriver . By . css ( cssSelector ) ) ;
89
102
} ;
90
103
91
104
return elementFinder ;
@@ -98,20 +111,20 @@ var buildElementHelper = function(ptor) {
98
111
var elementArrayFinder = { } ;
99
112
100
113
elementArrayFinder . count = function ( ) {
101
- return ptor . findElements ( locator ) . then ( function ( arr ) {
114
+ return using ( ) . findElements ( locator ) . then ( function ( arr ) {
102
115
return arr . length ;
103
116
} ) ;
104
117
} ;
105
118
106
119
elementArrayFinder . get = function ( index ) {
107
- var id = ptor . findElements ( locator ) . then ( function ( arr ) {
120
+ var id = using ( ) . findElements ( locator ) . then ( function ( arr ) {
108
121
return arr [ index ] ;
109
122
} ) ;
110
123
return ptor . wrapWebElement ( new webdriver . WebElement ( ptor . driver , id ) ) ;
111
124
} ;
112
125
113
126
elementArrayFinder . first = function ( ) {
114
- var id = ptor . findElements ( locator ) . then ( function ( arr ) {
127
+ var id = using ( ) . findElements ( locator ) . then ( function ( arr ) {
115
128
if ( ! arr . length ) {
116
129
throw new Error ( 'No element found using locator: ' + locator . message ) ;
117
130
}
@@ -121,18 +134,18 @@ var buildElementHelper = function(ptor) {
121
134
} ;
122
135
123
136
elementArrayFinder . last = function ( ) {
124
- var id = ptor . findElements ( locator ) . then ( function ( arr ) {
137
+ var id = using ( ) . findElements ( locator ) . then ( function ( arr ) {
125
138
return arr [ arr . length - 1 ] ;
126
139
} ) ;
127
140
return ptor . wrapWebElement ( new webdriver . WebElement ( ptor . driver , id ) ) ;
128
141
} ;
129
142
130
143
elementArrayFinder . then = function ( fn ) {
131
- return ptor . findElements ( locator ) . then ( fn ) ;
144
+ return using ( ) . findElements ( locator ) . then ( fn ) ;
132
145
} ;
133
146
134
147
elementArrayFinder . each = function ( fn ) {
135
- ptor . findElements ( locator ) . then ( function ( arr ) {
148
+ using ( ) . findElements ( locator ) . then ( function ( arr ) {
136
149
arr . forEach ( function ( webElem ) {
137
150
fn ( webElem ) ;
138
151
} ) ;
@@ -168,7 +181,7 @@ var buildElementHelper = function(ptor) {
168
181
* of values returned by the map function.
169
182
*/
170
183
elementArrayFinder . map = function ( mapFn ) {
171
- return ptor . findElements ( locator ) . then ( function ( arr ) {
184
+ return using ( ) . findElements ( locator ) . then ( function ( arr ) {
172
185
var list = [ ] ;
173
186
arr . forEach ( function ( webElem , index ) {
174
187
var mapResult = mapFn ( webElem , index ) ;
0 commit comments