Skip to content

Commit de3307a

Browse files
authored
Add browser window navigation (#140) +semver:feature
Add browser window navigation +semver:feature - Update to Selenium 4.20.0
1 parent 8107606 commit de3307a

22 files changed

+465
-195
lines changed

pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<dependency>
8383
<groupId>com.github.aquality-automation</groupId>
8484
<artifactId>aquality-selenium-core</artifactId>
85-
<version>4.0.1</version>
85+
<version>4.0.2</version>
8686
</dependency>
8787
<dependency>
8888
<groupId>org.apache.commons</groupId>
@@ -92,24 +92,24 @@
9292
<dependency>
9393
<groupId>com.fasterxml.jackson.core</groupId>
9494
<artifactId>jackson-databind</artifactId>
95-
<version>2.16.1</version>
95+
<version>2.17.0</version>
9696
</dependency>
9797
<dependency>
9898
<groupId>org.slf4j</groupId>
9999
<artifactId>slf4j-simple</artifactId>
100-
<version>2.0.12</version>
100+
<version>2.0.13</version>
101101
<scope>test</scope>
102102
</dependency>
103103
<dependency>
104104
<groupId>org.openpnp</groupId>
105105
<artifactId>opencv</artifactId>
106-
<version>[4.7.0,)</version>
106+
<version>[4.9.0,)</version>
107107
</dependency>
108108

109109
<dependency>
110110
<groupId>org.testng</groupId>
111111
<artifactId>testng</artifactId>
112-
<version>7.9.0</version>
112+
<version>7.10.2</version>
113113
<scope>test</scope>
114114
</dependency>
115115
</dependencies>

src/main/java/aquality/selenium/browser/Browser.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,19 @@ private Navigation navigate() {
136136
}
137137

138138
/**
139-
* Provides interface to manage of browser tabs.
139+
* Provides interface to manage browser tabs.
140140
* @return Instance of IBrowserTabNavigation.
141141
*/
142142
public IBrowserTabNavigation tabs() {
143-
return new BrowserTabNavigation(getDriver(), localizedLogger);
143+
return new BrowserWindowNavigation(getDriver(), localizedLogger, WindowType.TAB);
144+
}
145+
146+
/**
147+
* Provides interface to manage browser windows.
148+
* @return Instance of IBrowserWindowNavigation.
149+
*/
150+
public IBrowserWindowNavigation windows() {
151+
return new BrowserWindowNavigation(getDriver(), localizedLogger, WindowType.WINDOW);
144152
}
145153

146154
/**

src/main/java/aquality/selenium/browser/BrowserTabNavigation.java

Lines changed: 0 additions & 113 deletions
This file was deleted.
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package aquality.selenium.browser;
2+
3+
import aquality.selenium.core.localization.ILocalizedLogger;
4+
import org.openqa.selenium.WindowType;
5+
import org.openqa.selenium.remote.RemoteWebDriver;
6+
7+
import java.net.URL;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import java.util.Set;
11+
12+
import static java.lang.String.format;
13+
14+
/**
15+
* Wrapper to work with browser tab/window navigation with localized logging.
16+
*/
17+
public class BrowserWindowNavigation implements IBrowserTabNavigation {
18+
19+
private final RemoteWebDriver driver;
20+
private final ILocalizedLogger logger;
21+
private final WindowType windowType;
22+
private final String type;
23+
24+
protected BrowserWindowNavigation(RemoteWebDriver driver, ILocalizedLogger logger, WindowType windowType) {
25+
this.driver = driver;
26+
this.logger = logger;
27+
this.windowType = windowType;
28+
type = windowType.name().toLowerCase();
29+
}
30+
31+
private void logInfo(String key, Object... params) {
32+
logger.info(String.format(key, type), params);
33+
}
34+
35+
@Override
36+
public String getCurrentHandle() {
37+
logInfo("loc.browser.get.%s.handle");
38+
return driver.getWindowHandle();
39+
}
40+
41+
@Override
42+
public Set<String> getHandles() {
43+
logInfo("loc.browser.get.%s.handles");
44+
return driver.getWindowHandles();
45+
}
46+
47+
@Override
48+
public void switchTo(final String handle, boolean closeCurrent) {
49+
logInfo("loc.browser.switch.to.%s.handle", handle);
50+
closeAndSwitch(handle, closeCurrent);
51+
}
52+
53+
@Override
54+
public void switchTo(int index, boolean closeCurrent) {
55+
logInfo("loc.browser.switch.to.%s.index", index);
56+
List<String> handles = new ArrayList<>(getHandles());
57+
if (index < 0 || handles.size() <= index) {
58+
throw new IndexOutOfBoundsException(format("Index of browser %1$s '%2$s' you provided is out of range 0..%3$s", type, index, handles.size()));
59+
}
60+
61+
String newTab = handles.get(index);
62+
closeAndSwitch(newTab, closeCurrent);
63+
}
64+
65+
@Override
66+
public void switchToLast(boolean closeCurrent) {
67+
logInfo("loc.browser.switch.to.new.%s");
68+
List<String> handles = new ArrayList<>(getHandles());
69+
closeAndSwitch(handles.get(handles.size() - 1), closeCurrent);
70+
}
71+
72+
@Override
73+
public void close() {
74+
logInfo("loc.browser.%s.close");
75+
driver.close();
76+
}
77+
78+
@Override
79+
public void openNew(boolean switchToNew) {
80+
openNew(switchToNew, true);
81+
}
82+
private void openNew(boolean switchToNew, boolean log) {
83+
if (log) {
84+
logInfo("loc.browser.%s.open.new");
85+
}
86+
String currentHandle = switchToNew ? null : getCurrentHandle();
87+
driver.switchTo().newWindow(windowType);
88+
if (!switchToNew) {
89+
closeAndSwitch(currentHandle, false);
90+
}
91+
}
92+
93+
@Override
94+
public void openNewViaJs(boolean switchToNew) {
95+
logInfo("loc.browser.%s.open.new");
96+
JavaScript script = WindowType.TAB == windowType ? JavaScript.OPEN_NEW_TAB : JavaScript.OPEN_NEW_WINDOW;
97+
driver.executeScript(script.getScript());
98+
if (switchToNew) {
99+
switchToLast();
100+
}
101+
}
102+
103+
@Override
104+
public void openInNew(final String url) {
105+
logInfo("loc.browser.navigate.in.new.%s", url);
106+
openNew(true, false);
107+
driver.navigate().to(url);
108+
}
109+
110+
@Override
111+
public void openInNew(final URL url) {
112+
logInfo("loc.browser.navigate.in.new.%s", url);
113+
driver.switchTo().newWindow(windowType);
114+
driver.navigate().to(url);
115+
}
116+
117+
@Override
118+
public void openInNewViaJs(final String url) {
119+
JavaScript script = WindowType.TAB == windowType ? JavaScript.OPEN_IN_NEW_TAB : JavaScript.OPEN_IN_NEW_WINDOW;
120+
driver.executeScript(script.getScript(), url);
121+
}
122+
123+
private void closeAndSwitch(final String name, boolean closeCurrent) {
124+
if (closeCurrent) {
125+
close();
126+
}
127+
128+
driver.switchTo().window(name);
129+
}
130+
}

0 commit comments

Comments
 (0)