Skip to content
This repository was archived by the owner on Mar 25, 2025. It is now read-only.

Commit 66d8f9d

Browse files
committed
Added WebDriverBrowser tests
1 parent ad23c7c commit 66d8f9d

File tree

3 files changed

+263
-14
lines changed

3 files changed

+263
-14
lines changed

webtester-core/src/main/java/info/novatec/testit/webtester/browser/WebDriverBrowser.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55

66
import lombok.extern.slf4j.Slf4j;
77

8+
import info.novatec.testit.webtester.adhoc.AdHocFinder;
89
import info.novatec.testit.webtester.browser.operations.AlertHandler;
10+
import info.novatec.testit.webtester.browser.operations.CurrentWindow;
911
import info.novatec.testit.webtester.browser.operations.FocusSetter;
1012
import info.novatec.testit.webtester.browser.operations.JavaScriptExecutor;
1113
import info.novatec.testit.webtester.browser.operations.Navigator;
12-
import info.novatec.testit.webtester.browser.operations.UrlOpener;
1314
import info.novatec.testit.webtester.browser.operations.PageSourceSaver;
1415
import info.novatec.testit.webtester.browser.operations.ScreenshotTaker;
15-
import info.novatec.testit.webtester.browser.operations.CurrentWindow;
16+
import info.novatec.testit.webtester.browser.operations.UrlOpener;
1617
import info.novatec.testit.webtester.config.Configuration;
1718
import info.novatec.testit.webtester.config.builders.DefaultConfigurationBuilder;
1819
import info.novatec.testit.webtester.events.EventSystem;
1920
import info.novatec.testit.webtester.events.EventSystemImpl;
2021
import info.novatec.testit.webtester.events.browser.ClosedBrowserEvent;
2122
import info.novatec.testit.webtester.internal.PageFactory;
2223
import info.novatec.testit.webtester.pages.Page;
23-
import info.novatec.testit.webtester.adhoc.AdHocFinder;
2424

2525

2626
/**
@@ -44,7 +44,6 @@
4444
public final class WebDriverBrowser implements Browser {
4545

4646
private final Configuration configuration;
47-
4847
private final WebDriver webDriver;
4948

5049
private final UrlOpener open;
@@ -54,11 +53,12 @@ public final class WebDriverBrowser implements Browser {
5453
private final ScreenshotTaker screenshot;
5554
private final PageSourceSaver pageSource;
5655
private final JavaScriptExecutor javaScript;
56+
private final FocusSetter focus;
5757
private final EventSystem eventSystem;
58+
5859
private final AdHocFinder adHocFinder;
5960
private final PageFactory pageFactory;
6061

61-
private final FocusSetter focus;
6262
private boolean closed;
6363

6464
private WebDriverBrowser(Configuration configuration, WebDriver webDriver) {
@@ -75,6 +75,7 @@ private WebDriverBrowser(Configuration configuration, WebDriver webDriver) {
7575
this.javaScript = new JavaScriptExecutor(this);
7676
this.focus = new FocusSetter(this);
7777
this.eventSystem = new EventSystemImpl(this);
78+
7879
this.adHocFinder = new AdHocFinder(this);
7980
this.pageFactory = new PageFactory(this);
8081

@@ -89,15 +90,9 @@ public <T extends Page> T create(Class<T> pageClass) {
8990
public void close() {
9091
if (!closed) {
9192
log.debug("closing browser {}", this);
92-
try {
93-
EventSystem events = events();
94-
if(events.isEnabled()) {
95-
events.fireEvent(new ClosedBrowserEvent());
96-
}
97-
} finally {
98-
webDriver().quit();
99-
closed = true;
100-
}
93+
events().fireEvent(new ClosedBrowserEvent());
94+
webDriver().quit();
95+
closed = true;
10196
} else {
10297
log.debug("browser {} already closed - ignoring call to close", this);
10398
}
Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
package info.novatec.testit.webtester.browser;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.Mockito.doReturn;
5+
import static org.mockito.Mockito.mock;
6+
import static org.mockito.Mockito.verify;
7+
import static org.mockito.Mockito.verifyNoMoreInteractions;
8+
9+
import org.junit.Test;
10+
import org.junit.experimental.runners.Enclosed;
11+
import org.junit.runner.RunWith;
12+
import org.mockito.InjectMocks;
13+
import org.mockito.Mock;
14+
import org.mockito.runners.MockitoJUnitRunner;
15+
import org.openqa.selenium.WebDriver;
16+
17+
import utils.TestUtils;
18+
import utils.events.EventCaptor;
19+
20+
import info.novatec.testit.webtester.browser.operations.UrlOpener;
21+
import info.novatec.testit.webtester.config.Configuration;
22+
import info.novatec.testit.webtester.events.browser.ClosedBrowserEvent;
23+
import info.novatec.testit.webtester.internal.PageFactory;
24+
import info.novatec.testit.webtester.pages.Page;
25+
26+
27+
@RunWith(Enclosed.class)
28+
public class WebDriverBrowserTest {
29+
30+
@RunWith(MockitoJUnitRunner.class)
31+
public static class BrowserOperations {
32+
33+
@InjectMocks
34+
WebDriverBrowser browser;
35+
36+
@Test
37+
public void urlOpenerIsReturned() {
38+
assertThat(browser.open()).isNotNull();
39+
}
40+
41+
@Test
42+
public void currentWindowIsReturned() {
43+
assertThat(browser.currentWindow()).isNotNull();
44+
}
45+
46+
@Test
47+
public void navigatorIsReturned() {
48+
assertThat(browser.navigate()).isNotNull();
49+
}
50+
51+
@Test
52+
public void alertHandlerIsReturned() {
53+
assertThat(browser.alert()).isNotNull();
54+
}
55+
56+
@Test
57+
public void screenshotTakerIsReturned() {
58+
assertThat(browser.screenshot()).isNotNull();
59+
}
60+
61+
@Test
62+
public void pageSourceSaverIsReturned() {
63+
assertThat(browser.pageSource()).isNotNull();
64+
}
65+
66+
@Test
67+
public void javaScriptExecutorIsReturned() {
68+
assertThat(browser.javaScript()).isNotNull();
69+
}
70+
71+
@Test
72+
public void focusSetterIsReturned() {
73+
assertThat(browser.focus()).isNotNull();
74+
}
75+
76+
@Test
77+
public void eventSystemIsReturned() {
78+
assertThat(browser.events()).isNotNull();
79+
}
80+
81+
@Test
82+
public void adHocFinderIsReturned() {
83+
assertThat(browser.finder()).isNotNull();
84+
}
85+
86+
}
87+
88+
@RunWith(MockitoJUnitRunner.class)
89+
public static class CloseBrowser {
90+
91+
@Mock
92+
Configuration configuration;
93+
@Mock
94+
WebDriver webDriver;
95+
@InjectMocks
96+
WebDriverBrowser browser;
97+
98+
@Test
99+
public void callingCloseMultipleTimesOnlyClosesBrowserTheFirstTime() {
100+
browser.close();
101+
browser.close();
102+
verify(webDriver).quit();
103+
verifyNoMoreInteractions(webDriver);
104+
}
105+
106+
@Test
107+
public void closingBrowserFiresEvent() {
108+
doReturn(true).when(configuration).isEventSystemEnabled();
109+
EventCaptor.capture(browser.events(), ClosedBrowserEvent.class)
110+
.execute(() -> browser.close())
111+
.assertEventWasFired();
112+
}
113+
114+
}
115+
116+
@RunWith(MockitoJUnitRunner.class)
117+
public static class CurrentPageTitle {
118+
119+
@Mock
120+
WebDriver webDriver;
121+
@InjectMocks
122+
WebDriverBrowser browser;
123+
124+
@Test
125+
public void pageTitleIsRetrievedFromWebDriver() {
126+
doReturn("Title").when(webDriver).getTitle();
127+
assertThat(browser.currentPageTitle()).isEqualTo("Title");
128+
}
129+
130+
@Test
131+
public void nullTitlesAreDefaultedToEmptyString() {
132+
doReturn(null).when(webDriver).getTitle();
133+
assertThat(browser.currentPageTitle()).isEqualTo("");
134+
}
135+
136+
}
137+
138+
@RunWith(MockitoJUnitRunner.class)
139+
public static class CurrentUrl {
140+
141+
@Mock
142+
WebDriver webDriver;
143+
@InjectMocks
144+
WebDriverBrowser browser;
145+
146+
@Test
147+
public void urlIsRetrievedFromWebDriver() {
148+
doReturn("http://www.foo.com").when(webDriver).getCurrentUrl();
149+
assertThat(browser.currentUrl()).isEqualTo("http://www.foo.com");
150+
}
151+
152+
@Test
153+
public void nullUrlsAreDefaultedToEmptyString() {
154+
doReturn(null).when(webDriver).getCurrentUrl();
155+
assertThat(browser.currentUrl()).isEqualTo("");
156+
}
157+
158+
}
159+
160+
@RunWith(MockitoJUnitRunner.class)
161+
public static class CreatePage {
162+
163+
@Mock
164+
PageFactory pageFactory;
165+
@InjectMocks
166+
WebDriverBrowser browser;
167+
168+
@Test
169+
public void pagesAreCreatedByTheBrowserPageFactory() {
170+
171+
TestUtils.setFieldValue(browser, "pageFactory", pageFactory);
172+
173+
TestPage page = mock(TestPage.class);
174+
doReturn(page).when(this.pageFactory).page(TestPage.class);
175+
176+
TestPage actualPage = browser.create(TestPage.class);
177+
assertThat(actualPage).isSameAs(page);
178+
179+
}
180+
181+
public interface TestPage extends Page {
182+
183+
}
184+
185+
}
186+
187+
@RunWith(MockitoJUnitRunner.class)
188+
public static class DefaultMethods {
189+
190+
@Mock
191+
UrlOpener open;
192+
@InjectMocks
193+
WebDriverBrowser browser;
194+
195+
@Test
196+
public void openingAnUrlInvokesTheOpenUrlOperationClass() {
197+
TestUtils.setFieldValue(browser, "open", open);
198+
browser.open("http://www.foo.com");
199+
verify(open).url("http://www.foo.com");
200+
}
201+
202+
}
203+
204+
public static class FactoryAndBuilder {
205+
206+
@Test
207+
public void browserCanBeDirectlyBuildFromWebDriver() {
208+
209+
WebDriver webDriver = mock(WebDriver.class);
210+
211+
Browser browser = WebDriverBrowser.buildForWebDriver(webDriver);
212+
213+
assertThat(browser.webDriver()).isSameAs(webDriver);
214+
assertThat(browser.configuration()).isNotNull();
215+
216+
}
217+
218+
@Test
219+
public void browserBuildCanBeCustomized() {
220+
221+
WebDriver webDriver = mock(WebDriver.class);
222+
Configuration configuration = mock(Configuration.class);
223+
224+
Browser browser = WebDriverBrowser.forWebDriver(webDriver).withConfiguration(configuration).build();
225+
226+
assertThat(browser.webDriver()).isSameAs(webDriver);
227+
assertThat(browser.configuration()).isSameAs(configuration);
228+
229+
}
230+
231+
}
232+
233+
}

webtester-core/src/test/java/utils/TestUtils.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package utils;
22

3+
import java.lang.reflect.Field;
34
import java.lang.reflect.UndeclaredThrowableException;
45
import java.net.MalformedURLException;
56
import java.net.URL;
@@ -15,6 +16,26 @@ public static URL toUrl(String url) {
1516
}
1617
}
1718

19+
/**
20+
* Sets the value for a field with the given name of the given object using reflection.
21+
* <p>
22+
* <b>Note:</b> the field's visibility will be changed in order for this operation to work.
23+
*
24+
* @param object the object who's field value should be set
25+
* @param fieldName the name of the field
26+
* @param value the value to set
27+
* @throws IllegalArgumentException in case of an error
28+
*/
29+
public static void setFieldValue(Object object, String fieldName, Object value) {
30+
try {
31+
Field field = object.getClass().getDeclaredField(fieldName);
32+
field.setAccessible(true);
33+
field.set(object, value);
34+
} catch (NoSuchFieldException | IllegalAccessException e) {
35+
throw new IllegalArgumentException("could not set field value of '" + fieldName + "'", e);
36+
}
37+
}
38+
1839
private TestUtils() {
1940
// utility class constructor
2041
}

0 commit comments

Comments
 (0)