Skip to content

Commit b59cfe0

Browse files
vicky-ivcgoldbergdiemol
authored
[java] Refactored selectByContainsVisibleText and selectByVisibleText methods to remove code duplication (#16257)
Co-authored-by: Corey Goldberg <[email protected]> Co-authored-by: Diego Molina <[email protected]>
1 parent ed794f7 commit b59cfe0

File tree

1 file changed

+69
-96
lines changed

1 file changed

+69
-96
lines changed

java/src/org/openqa/selenium/support/ui/Select.java

Lines changed: 69 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -122,55 +122,7 @@ public WebElement getFirstSelectedOption() {
122122
*/
123123
@Override
124124
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);
174126
}
175127

176128
/**
@@ -193,53 +145,7 @@ public void selectByVisibleText(String text) {
193145
*/
194146
@Override
195147
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);
243149
}
244150

245151
private String getLongestSubstringWithoutSpace(String s) {
@@ -425,6 +331,73 @@ private void setSelected(WebElement option, boolean select) {
425331
}
426332
}
427333

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+
428401
private void assertOptionIsEnabled(WebElement option, boolean select) {
429402
if (select && !option.isEnabled()) {
430403
throw new UnsupportedOperationException("You may not select a disabled option");

0 commit comments

Comments
 (0)