@@ -122,55 +122,7 @@ public WebElement getFirstSelectedOption() {
122
122
*/
123
123
@ Override
124
124
public void selectByVisibleText (String text ) {
125
- assertSelectIsEnabled ();
126
- assertSelectIsVisible ();
127
-
128
- // try to find the option via XPATH ...
129
- List <WebElement > options =
130
- element .findElements (
131
- By .xpath (".//option[normalize-space(.) = " + Quotes .escape (text ) + "]" ));
132
-
133
- for (WebElement option : options ) {
134
- if (!hasCssPropertyAndVisible (option ))
135
- throw new NoSuchElementException ("Invisible option with text: " + text );
136
- setSelected (option , true );
137
- if (!isMultiple ()) {
138
- return ;
139
- }
140
- }
141
-
142
- boolean matched = !options .isEmpty ();
143
- if (!matched && text .contains (" " )) {
144
- String subStringWithoutSpace = getLongestSubstringWithoutSpace (text );
145
- List <WebElement > candidates ;
146
- if ("" .equals (subStringWithoutSpace )) {
147
- // hmm, text is either empty or contains only spaces - get all options ...
148
- candidates = element .findElements (By .tagName ("option" ));
149
- } else {
150
- // get candidates via XPATH ...
151
- candidates =
152
- element .findElements (
153
- By .xpath (".//option[contains(., " + Quotes .escape (subStringWithoutSpace ) + ")]" ));
154
- }
155
-
156
- String trimmed = text .trim ();
157
-
158
- for (WebElement option : candidates ) {
159
- if (trimmed .equals (option .getText ().trim ())) {
160
- if (!hasCssPropertyAndVisible (option ))
161
- throw new NoSuchElementException ("Invisible option with text: " + text );
162
- setSelected (option , true );
163
- if (!isMultiple ()) {
164
- return ;
165
- }
166
- matched = true ;
167
- }
168
- }
169
- }
170
-
171
- if (!matched ) {
172
- throw new NoSuchElementException ("Cannot locate option with text: " + text );
173
- }
125
+ selectByVisibleText (text , false );
174
126
}
175
127
176
128
/**
@@ -193,53 +145,7 @@ public void selectByVisibleText(String text) {
193
145
*/
194
146
@ Override
195
147
public void selectByContainsVisibleText (String text ) {
196
- assertSelectIsEnabled ();
197
- assertSelectIsVisible ();
198
-
199
- // try to find the option via XPATH ...
200
- List <WebElement > options =
201
- element .findElements (
202
- By .xpath (".//option[normalize-space(.) = " + Quotes .escape (text ) + "]" ));
203
-
204
- for (WebElement option : options ) {
205
- if (!hasCssPropertyAndVisible (option ))
206
- throw new NoSuchElementException ("Invisible option with text: " + text );
207
- setSelected (option , true );
208
- if (!isMultiple ()) {
209
- return ;
210
- }
211
- }
212
-
213
- boolean matched = !options .isEmpty ();
214
- if (!matched ) {
215
- String searchText = text .contains (" " ) ? getLongestSubstringWithoutSpace (text ) : text ;
216
-
217
- List <WebElement > candidates ;
218
- if (searchText .isEmpty ()) {
219
- candidates = element .findElements (By .tagName ("option" ));
220
- } else {
221
- candidates =
222
- element .findElements (
223
- By .xpath (".//option[contains(., " + Quotes .escape (searchText ) + ")]" ));
224
- }
225
-
226
- String trimmed = text .trim ();
227
- for (WebElement option : candidates ) {
228
- if (option .getText ().contains (trimmed )) {
229
- if (!hasCssPropertyAndVisible (option ))
230
- throw new NoSuchElementException ("Invisible option with text: " + text );
231
- setSelected (option , true );
232
- if (!isMultiple ()) {
233
- return ;
234
- }
235
- matched = true ;
236
- }
237
- }
238
- }
239
-
240
- if (!matched ) {
241
- throw new NoSuchElementException ("Cannot locate option with text: " + text );
242
- }
148
+ selectByVisibleText (text , true );
243
149
}
244
150
245
151
private String getLongestSubstringWithoutSpace (String s ) {
@@ -425,6 +331,73 @@ private void setSelected(WebElement option, boolean select) {
425
331
}
426
332
}
427
333
334
+ /**
335
+ * @param text The visible text to match against. It can be a partial match of the option if
336
+ * isPartialMatch = true
337
+ * @param isPartialMatch If true a partial match on the Options list will be performed, otherwise
338
+ * exact match
339
+ * @throws NoSuchElementException If no matching option elements are found or matching options are
340
+ * hidden
341
+ */
342
+ private void selectByVisibleText (String text , boolean isPartialMatch ) {
343
+ assertSelectIsEnabled ();
344
+ assertSelectIsVisible ();
345
+
346
+ // try to find the option via XPATH ...
347
+ List <WebElement > options =
348
+ element .findElements (
349
+ By .xpath (".//option[normalize-space(.) = " + Quotes .escape (text ) + "]" ));
350
+
351
+ for (WebElement option : options ) {
352
+ if (!hasCssPropertyAndVisible (option ))
353
+ throw new NoSuchElementException ("Invisible option with text: " + text );
354
+
355
+ setSelected (option , true );
356
+
357
+ if (!isMultiple ()) {
358
+ return ;
359
+ }
360
+ }
361
+
362
+ boolean matched = !options .isEmpty ();
363
+ if (!matched ) {
364
+ String searchText = text .contains (" " ) ? getLongestSubstringWithoutSpace (text ) : text ;
365
+
366
+ List <WebElement > candidates ;
367
+ if (searchText .isEmpty ()) {
368
+ candidates = element .findElements (By .tagName ("option" ));
369
+ } else {
370
+ candidates =
371
+ element .findElements (
372
+ By .xpath (".//option[contains(., " + Quotes .escape (searchText ) + ")]" ));
373
+ }
374
+
375
+ String trimmed = text .trim ();
376
+ for (WebElement option : candidates ) {
377
+ boolean isMatchedOptionFound =
378
+ isPartialMatch
379
+ ? option .getText ().contains (trimmed )
380
+ : option .getText ().trim ().equals (trimmed );
381
+
382
+ if (isMatchedOptionFound ) {
383
+ if (!hasCssPropertyAndVisible (option ))
384
+ throw new NoSuchElementException ("Invisible option with text: " + text );
385
+
386
+ setSelected (option , true );
387
+
388
+ if (!isMultiple ()) {
389
+ return ;
390
+ }
391
+ matched = true ;
392
+ }
393
+ }
394
+ }
395
+
396
+ if (!matched ) {
397
+ throw new NoSuchElementException ("Cannot locate option with text: " + text );
398
+ }
399
+ }
400
+
428
401
private void assertOptionIsEnabled (WebElement option , boolean select ) {
429
402
if (select && !option .isEnabled ()) {
430
403
throw new UnsupportedOperationException ("You may not select a disabled option" );
0 commit comments