Skip to content

Commit 2a5532d

Browse files
Merge pull request #446 from telekom/feature/device-emulation
Added helper method to use CDP device emulation
2 parents 24bb0b9 + 202d102 commit 2a5532d

File tree

5 files changed

+80
-1
lines changed

5 files changed

+80
-1
lines changed

docs/src/docs/selenium4/selenium4-cdp.adoc

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,4 +259,41 @@ public class ChromeDevToolsTests extends TesterraTest implements
259259
260260
----
261261

262+
== Set device emulation
262263

264+
There is a simple implementation to emulate mobile devices.
265+
266+
[source, java]
267+
----
268+
269+
public class ChromeDevToolsTests extends TesterraTest implements
270+
ChromeDevToolsProvider,
271+
WebDriverManagerProvider {
272+
273+
@Test
274+
public void test_CDP_GeoLocation() {
275+
WebDriver webDriver = WEB_DRIVER_MANAGER.getWebDriver();
276+
277+
CHROME_DEV_TOOLS.setDevice(
278+
webDriver,
279+
new Dimension(400, 900), // resolution
280+
100, // Scale factor
281+
true); // it's a mobile device
282+
283+
webDriver.get("...");
284+
}
285+
286+
}
287+
288+
----
289+
290+
If you need some more impact on device settings, you can use the origin method
291+
292+
[source, java]
293+
----
294+
WebDriver webDriver = WEB_DRIVER_MANAGER.getWebDriver();
295+
DevTools devTools = CHROME_DEV_TOOLS.getRawDevTools(webDriver);
296+
devTools.send(Emulation.setDeviceMetricsOverride(...);
297+
----
298+
299+
See here for more details: https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setDeviceMetricsOverride

driver-ui/src/main/java/eu/tsystems/mms/tic/testframework/pageobjects/internal/ResponsiveClassFinder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,9 @@ private static int getBrowserViewportSize(final WebDriver driver, final int view
214214
// mehrfaches auslesen verhindern, nur auslesen wenn nötig
215215
return viewportWidth;
216216
}
217-
Object o = JSUtils.executeScript(driver, "return window.innerWidth");
217+
// In case of using Chrome CDP device emulation
218+
// https://developer.chrome.com/blog/visual-viewport-api
219+
Object o = JSUtils.executeScript(driver, "return window.visualViewport.width");
218220
if (o instanceof Long) {
219221
int viewportWidthNew = (int) (long) (Long) o;
220222
LOGGER.debug(String.format("Browser viewport width is %dpx", viewportWidthNew));

driver-ui/src/main/java/eu/tsystems/mms/tic/testframework/testing/SeleniumChromeDevTools.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import eu.tsystems.mms.tic.testframework.logging.Loggable;
2424
import eu.tsystems.mms.tic.testframework.webdrivermanager.ChromeDevTools;
2525
import org.openqa.selenium.Credentials;
26+
import org.openqa.selenium.Dimension;
2627
import org.openqa.selenium.UsernameAndPassword;
2728
import org.openqa.selenium.WebDriver;
2829
import org.openqa.selenium.chrome.ChromeDriver;
@@ -90,6 +91,32 @@ public void setGeoLocation(WebDriver webDriver, double latitude, double longitud
9091
log().info("Changed geolocation information to lat={}, long={}", latitude, longitude);
9192
}
9293

94+
@Override
95+
public void setDevice(WebDriver webDriver, Dimension dimension, int scaleFactor, boolean mobile) {
96+
if (!isSupported(webDriver)) {
97+
throw new RuntimeException("The current browser does not support DevTools");
98+
}
99+
DevTools devTools = this.getRawDevTools(webDriver);
100+
devTools.send(Emulation.setDeviceMetricsOverride(
101+
dimension.getWidth(),
102+
dimension.getHeight(),
103+
100,
104+
true,
105+
Optional.empty(),
106+
Optional.empty(),
107+
Optional.empty(),
108+
Optional.empty(),
109+
Optional.empty(),
110+
Optional.empty(),
111+
Optional.empty(),
112+
Optional.empty(),
113+
Optional.empty(),
114+
Optional.empty()
115+
)
116+
);
117+
log().info("Changed device metrics to {}x{} with scale={}", dimension.getWidth(), dimension.getHeight(), scaleFactor);
118+
}
119+
93120
@Override
94121
public void setBasicAuthentication(WebDriver webDriver, Supplier<Credentials> credentials) {
95122
if (!isSupported(webDriver)) {

driver-ui/src/main/java/eu/tsystems/mms/tic/testframework/webdrivermanager/ChromeDevTools.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import eu.tsystems.mms.tic.testframework.constants.Browsers;
2424
import eu.tsystems.mms.tic.testframework.testing.WebDriverManagerProvider;
2525
import org.openqa.selenium.Credentials;
26+
import org.openqa.selenium.Dimension;
2627
import org.openqa.selenium.WebDriver;
2728
import org.openqa.selenium.devtools.DevTools;
2829

@@ -40,6 +41,8 @@ public interface ChromeDevTools extends WebDriverManagerProvider {
4041

4142
void setGeoLocation(WebDriver webDriver, double latitude, double longitude, int accuracy);
4243

44+
void setDevice(WebDriver webDriver, Dimension dimension, int scaleFactor, boolean mobile);
45+
4346
void setBasicAuthentication(WebDriver webDriver, Supplier<Credentials> credentials);
4447

4548
default boolean isSupported(WebDriver driver) {

integration-tests/src/test/java/eu/tsystems/mms/tic/testframework/playground/ChromeDevToolsTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import eu.tsystems.mms.tic.testframework.utils.TimerUtils;
2828
import eu.tsystems.mms.tic.testframework.webdrivermanager.DesktopWebDriverRequest;
2929
import org.openqa.selenium.By;
30+
import org.openqa.selenium.Dimension;
3031
import org.openqa.selenium.HasAuthentication;
3132
import org.openqa.selenium.JavascriptException;
3233
import org.openqa.selenium.UsernameAndPassword;
@@ -338,4 +339,13 @@ public void testT13_NetworkListener() {
338339
}
339340
}
340341

342+
@Test
343+
public void testT14_MobileDeviceEmulation() {
344+
WebDriver webDriver = WEB_DRIVER_MANAGER.getWebDriver();
345+
CHROME_DEV_TOOLS.setDevice(webDriver, new Dimension(400, 900), 100, true);
346+
347+
webDriver.get("https://the-internet.herokuapp.com/broken_images");
348+
349+
}
350+
341351
}

0 commit comments

Comments
 (0)