Skip to content

Commit 18028ac

Browse files
kumar-nitishbarancev
authored andcommitted
ByAll.findElement should not not use remaining locators if an element is already found.
Fixes #4471 Signed-off-by: Alexei Barantsev <[email protected]>
1 parent 808b306 commit 18028ac

File tree

2 files changed

+65
-4
lines changed
  • java/client

2 files changed

+65
-4
lines changed

java/client/src/org/openqa/selenium/support/pagefactory/ByAll.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,13 @@ public ByAll(By... bys) {
4949

5050
@Override
5151
public WebElement findElement(SearchContext context) {
52-
List<WebElement> elements = findElements(context);
53-
if (elements.isEmpty()) {
54-
throw new NoSuchElementException("Cannot locate an element using " + toString());
52+
for (By by : bys) {
53+
List<WebElement> elements = context.findElements(by);
54+
if (!elements.isEmpty()) {
55+
return elements.get(0);
56+
}
5557
}
56-
return elements.get(0);
58+
throw new NoSuchElementException("Cannot locate an element using " + toString());
5759
}
5860

5961
@Override

java/client/test/org/openqa/selenium/support/pagefactory/ByAllTest.java

+59
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
import static org.hamcrest.Matchers.instanceOf;
2222
import static org.junit.Assert.assertThat;
2323
import static org.junit.Assert.assertTrue;
24+
import static org.mockito.Matchers.any;
2425
import static org.mockito.Mockito.mock;
26+
import static org.mockito.Mockito.times;
27+
import static org.mockito.Mockito.verify;
28+
import static org.mockito.Mockito.verifyNoMoreInteractions;
2529
import static org.mockito.Mockito.when;
2630
import static org.openqa.selenium.testing.TestUtilities.catchThrowable;
2731

@@ -125,6 +129,32 @@ public void findFourElementBy() {
125129

126130
ByAll by = new ByAll(By.name("cheese"), By.name("photo"));
127131
assertThat(by.findElement(driver), equalTo(elem1));
132+
133+
verify(driver, times(1)).findElements(any(By.class));
134+
verifyNoMoreInteractions(driver);
135+
}
136+
137+
@Test
138+
public void findFourElementByInReverseOrder() {
139+
final WebElement elem1 = mock(WebElement.class, "webElement1");
140+
final WebElement elem2 = mock(WebElement.class, "webElement2");
141+
final WebElement elem3 = mock(WebElement.class, "webElement3");
142+
final WebElement elem4 = mock(WebElement.class, "webElement4");
143+
final List<WebElement> elems12 = new ArrayList<>();
144+
elems12.add(elem1);
145+
elems12.add(elem2);
146+
final List<WebElement> elems34 = new ArrayList<>();
147+
elems34.add(elem3);
148+
elems34.add(elem4);
149+
150+
when(driver.findElements(By.name("cheese"))).thenReturn(elems12);
151+
when(driver.findElements(By.name("photo"))).thenReturn(elems34);
152+
153+
ByAll by = new ByAll(By.name("photo"), By.name("cheese"));
154+
assertThat(by.findElement(driver), equalTo(elem3));
155+
156+
verify(driver, times(1)).findElements(any(By.class));
157+
verifyNoMoreInteractions(driver);
128158
}
129159

130160
@Test
@@ -148,6 +178,35 @@ public void findFourElementsByAny() {
148178

149179
ByAll by = new ByAll(By.name("cheese"), By.name("photo"));
150180
assertThat(by.findElements(driver), equalTo(elems1234));
181+
182+
verify(driver, times(2)).findElements(any(By.class));
183+
verifyNoMoreInteractions(driver);
184+
}
185+
186+
@Test
187+
public void findFourElementsByAnyInReverseOrder() {
188+
final WebElement elem1 = mock(WebElement.class, "webElement1");
189+
final WebElement elem2 = mock(WebElement.class, "webElement2");
190+
final WebElement elem3 = mock(WebElement.class, "webElement3");
191+
final WebElement elem4 = mock(WebElement.class, "webElement4");
192+
final List<WebElement> elems12 = new ArrayList<>();
193+
elems12.add(elem1);
194+
elems12.add(elem2);
195+
final List<WebElement> elems34 = new ArrayList<>();
196+
elems34.add(elem3);
197+
elems34.add(elem4);
198+
final List<WebElement> elems3412 = new ArrayList<>();
199+
elems3412.addAll(elems34);
200+
elems3412.addAll(elems12);
201+
202+
when(driver.findElements(By.name("cheese"))).thenReturn(elems12);
203+
when(driver.findElements(By.name("photo"))).thenReturn(elems34);
204+
205+
ByAll by = new ByAll(By.name("photo"), By.name("cheese"));
206+
assertThat(by.findElements(driver), equalTo(elems3412));
207+
208+
verify(driver, times(2)).findElements(any(By.class));
209+
verifyNoMoreInteractions(driver);
151210
}
152211

153212
@Test

0 commit comments

Comments
 (0)