diff --git a/vividus-plugin-mobile-app/src/main/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManager.java b/vividus-plugin-mobile-app/src/main/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManager.java index 6684dc0999..1d719574ef 100644 --- a/vividus-plugin-mobile-app/src/main/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManager.java +++ b/vividus-plugin-mobile-app/src/main/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManager.java @@ -119,6 +119,14 @@ public double getDpr() private double calculateDpr() { + if (isAndroidNativeApp()) + { + // On Android platform the ratio between the device window size and taken screenshot size is equal to 1 + // regardless of the device's display density. + // Also see https://github.com/appium/appium-base-driver/pull/306 for details. + return 1D; + } + try { byte[] imageBytes = getUnwrappedDriver(TakesScreenshot.class).getScreenshotAs(OutputType.BYTES); diff --git a/vividus-plugin-mobile-app/src/test/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManagerTests.java b/vividus-plugin-mobile-app/src/test/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManagerTests.java index 16a780648b..485ad19e5d 100644 --- a/vividus-plugin-mobile-app/src/test/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManagerTests.java +++ b/vividus-plugin-mobile-app/src/test/java/org/vividus/selenium/mobileapp/MobileAppWebDriverManagerTests.java @@ -45,6 +45,7 @@ import org.openqa.selenium.Capabilities; import org.openqa.selenium.Dimension; import org.openqa.selenium.HasCapabilities; +import org.openqa.selenium.MutableCapabilities; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; @@ -84,12 +85,8 @@ class MobileAppWebDriverManagerTests private int mockStatusBarHeightRetrieval() { - ExecutesMethod executingMethodDriver = mock(ExecutesMethod.class); - when(webDriverProvider.getUnwrapped(ExecutesMethod.class)).thenReturn(executingMethodDriver); - Response response = new Response(); long height = 101L; - response.setValue(Map.of(STAT_BAR_HEIGHT, height)); - when(executingMethodDriver.execute(GET_SESSION_COMMAND)).thenReturn(response); + mockGetSession(Map.of(STAT_BAR_HEIGHT, height)); return (int) height; } @@ -138,12 +135,7 @@ void shouldProviderStatusBarHeightForIosWhenSauceLabsThrowAnError() void shouldPerformJsRequestForStatBarHeightWhenSessionDetailsStatBarHeightIsNullForIos() { mockCapabilities(MobilePlatform.IOS); - ExecutesMethod executingMethodDriver = mock(ExecutesMethod.class); - when(webDriverProvider.getUnwrapped(ExecutesMethod.class)).thenReturn(executingMethodDriver); - - Response response = new Response(); - response.setValue(Collections.EMPTY_MAP); - when(executingMethodDriver.execute(GET_SESSION_COMMAND)).thenReturn(response); + mockGetSession(Collections.EMPTY_MAP); when(javascriptActions.executeScript(MOBILE_DEVICE_SCREEN_INFO_JS)).thenReturn(STATUS_BAR_SIZE); assertEquals(44, driverManager.getStatusBarSize()); } @@ -177,15 +169,14 @@ private void mockCapabilities(String platform) { WebDriver webDriver = mock(WebDriver.class, withSettings().extraInterfaces(HasCapabilities.class)); when(webDriverProvider.get()).thenReturn(webDriver); - Capabilities capabilitiesMock = mock(Capabilities.class); - when(((HasCapabilities) webDriver).getCapabilities()).thenReturn(capabilitiesMock); + Capabilities capabilities = new MutableCapabilities(Map.of(CapabilityType.PLATFORM_NAME, platform)); + when(((HasCapabilities) webDriver).getCapabilities()).thenReturn(capabilities); driverManager.setMobileApp(true); - when(capabilitiesMock.getCapability(CapabilityType.PLATFORM_NAME)).thenReturn(platform); } @SuppressWarnings("unchecked") @Test - void shouldProvideDpr() + void shouldProvideDprForAndroidNativeApp() { MobileAppWebDriverManager spyingDriverManager = new MobileAppWebDriverManager(webDriverProvider, webDriverSessionInfo, javascriptActions) @@ -202,6 +193,27 @@ public Dimension getSize() when(webDriverSessionInfo.get(eq(WebDriverSessionAttributes.DEVICE_PIXEL_RATIO), any(Supplier.class))).thenAnswer(invocation -> ((Supplier) invocation.getArguments()[1]).get()); assertEquals(1d, spyingDriverManager.getDpr()); + mockCapabilities(MobilePlatform.ANDROID); + when(webDriverSessionInfo.get(eq(WebDriverSessionAttributes.DEVICE_PIXEL_RATIO), + any(Supplier.class))).thenAnswer(invocation -> ((Supplier) invocation.getArguments()[1]).get()); + + assertEquals(1d, driverManager.getDpr()); + } + + @SuppressWarnings("unchecked") + @Test + void shouldProvideDprForIOS() + { + mockCapabilities(MobilePlatform.IOS); + when(webDriverSessionInfo.get(eq(WebDriverSessionAttributes.DEVICE_PIXEL_RATIO), + any(Supplier.class))).thenAnswer(invocation -> ((Supplier) invocation.getArguments()[1]).get()); + when(webDriverSessionInfo.get(eq(WebDriverSessionAttributes.SCREEN_SIZE), any(Supplier.class))) + .thenReturn(new Dimension(1, 1)); + + TakesScreenshot taker = mock(TakesScreenshot.class); + when(webDriverProvider.getUnwrapped(TakesScreenshot.class)).thenReturn(taker); + when(taker.getScreenshotAs(OutputType.BYTES)).thenReturn(IMAGE); + assertEquals(1d, driverManager.getDpr()); verify(webDriverProvider).getUnwrapped(TakesScreenshot.class); } @@ -221,6 +233,7 @@ void shouldRethrowIOException() { try (MockedStatic imageIo = Mockito.mockStatic(ImageIO.class)) { + mockCapabilities(MobilePlatform.IOS); imageIo.when(() -> ImageIO.read(any(InputStream.class))).thenThrow(new IOException("io is oi")); TakesScreenshot taker = mock(TakesScreenshot.class); when(webDriverProvider.getUnwrapped(TakesScreenshot.class)).thenReturn(taker); @@ -230,4 +243,13 @@ void shouldRethrowIOException() assertThrows(UncheckedIOException.class, driverManager::getDpr); } } + + private void mockGetSession(Object value) + { + ExecutesMethod executingMethodDriver = mock(ExecutesMethod.class); + when(webDriverProvider.getUnwrapped(ExecutesMethod.class)).thenReturn(executingMethodDriver); + Response response = new Response(); + response.setValue(value); + when(executingMethodDriver.execute(GET_SESSION_COMMAND)).thenReturn(response); + } } diff --git a/vividus-tests/src/main/resources/baselines/android-AREA-ignore.png b/vividus-tests/src/main/resources/baselines/android-AREA-ignore.png index cce2a23f0b..cc36314c42 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-AREA-ignore.png and b/vividus-tests/src/main/resources/baselines/android-AREA-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-ELEMENT-ignore.png b/vividus-tests/src/main/resources/baselines/android-ELEMENT-ignore.png index 2be3d7cc4e..a09debfd6f 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-ELEMENT-ignore.png and b/vividus-tests/src/main/resources/baselines/android-ELEMENT-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-context-with-ignore.png b/vividus-tests/src/main/resources/baselines/android-context-with-ignore.png index 53d3394465..6c5d617de4 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-context-with-ignore.png and b/vividus-tests/src/main/resources/baselines/android-context-with-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-context.png b/vividus-tests/src/main/resources/baselines/android-context.png index 17ec839684..948d258637 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-context.png and b/vividus-tests/src/main/resources/baselines/android-context.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-custom-config-AREA-ignore.png b/vividus-tests/src/main/resources/baselines/android-custom-config-AREA-ignore.png index d32a13d860..b1c36f8f01 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-custom-config-AREA-ignore.png and b/vividus-tests/src/main/resources/baselines/android-custom-config-AREA-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-custom-config-ELEMENT-ignore.png b/vividus-tests/src/main/resources/baselines/android-custom-config-ELEMENT-ignore.png index 70c2dec7a6..f7e2ccd123 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-custom-config-ELEMENT-ignore.png and b/vividus-tests/src/main/resources/baselines/android-custom-config-ELEMENT-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-custom-config.png b/vividus-tests/src/main/resources/baselines/android-custom-config.png index 55cbb21b19..57519498b1 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-custom-config.png and b/vividus-tests/src/main/resources/baselines/android-custom-config.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-cuts-context.png b/vividus-tests/src/main/resources/baselines/android-cuts-context.png index 3a2ea9a369..edfe0c2e37 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-cuts-context.png and b/vividus-tests/src/main/resources/baselines/android-cuts-context.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-cuts-full-page.png b/vividus-tests/src/main/resources/baselines/android-cuts-full-page.png index e77861c25a..a25f2a52d9 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-cuts-full-page.png and b/vividus-tests/src/main/resources/baselines/android-cuts-full-page.png differ diff --git a/vividus-tests/src/main/resources/baselines/android-full-page.png b/vividus-tests/src/main/resources/baselines/android-full-page.png index aa7b635637..23339957bf 100644 Binary files a/vividus-tests/src/main/resources/baselines/android-full-page.png and b/vividus-tests/src/main/resources/baselines/android-full-page.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-AREA-ignore.png b/vividus-tests/src/main/resources/baselines/original/android-AREA-ignore.png index 95c8817f46..cc36314c42 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-AREA-ignore.png and b/vividus-tests/src/main/resources/baselines/original/android-AREA-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-ELEMENT-ignore.png b/vividus-tests/src/main/resources/baselines/original/android-ELEMENT-ignore.png index 01c5583561..a09debfd6f 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-ELEMENT-ignore.png and b/vividus-tests/src/main/resources/baselines/original/android-ELEMENT-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-context-with-ignore.png b/vividus-tests/src/main/resources/baselines/original/android-context-with-ignore.png index cdc9a4d569..6c5d617de4 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-context-with-ignore.png and b/vividus-tests/src/main/resources/baselines/original/android-context-with-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-context.png b/vividus-tests/src/main/resources/baselines/original/android-context.png index 348b3299e4..948d258637 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-context.png and b/vividus-tests/src/main/resources/baselines/original/android-context.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-custom-config-AREA-ignore.png b/vividus-tests/src/main/resources/baselines/original/android-custom-config-AREA-ignore.png index eaf29117d8..b1c36f8f01 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-custom-config-AREA-ignore.png and b/vividus-tests/src/main/resources/baselines/original/android-custom-config-AREA-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-custom-config-ELEMENT-ignore.png b/vividus-tests/src/main/resources/baselines/original/android-custom-config-ELEMENT-ignore.png index 515db6918a..f7e2ccd123 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-custom-config-ELEMENT-ignore.png and b/vividus-tests/src/main/resources/baselines/original/android-custom-config-ELEMENT-ignore.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-custom-config.png b/vividus-tests/src/main/resources/baselines/original/android-custom-config.png index 11035c9dc3..57519498b1 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-custom-config.png and b/vividus-tests/src/main/resources/baselines/original/android-custom-config.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-cuts-context.png b/vividus-tests/src/main/resources/baselines/original/android-cuts-context.png index d6b0e5efe9..edfe0c2e37 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-cuts-context.png and b/vividus-tests/src/main/resources/baselines/original/android-cuts-context.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-cuts-full-page.png b/vividus-tests/src/main/resources/baselines/original/android-cuts-full-page.png index c60ea0275f..a25f2a52d9 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-cuts-full-page.png and b/vividus-tests/src/main/resources/baselines/original/android-cuts-full-page.png differ diff --git a/vividus-tests/src/main/resources/baselines/original/android-full-page.png b/vividus-tests/src/main/resources/baselines/original/android-full-page.png index af89fb4fa1..23339957bf 100644 Binary files a/vividus-tests/src/main/resources/baselines/original/android-full-page.png and b/vividus-tests/src/main/resources/baselines/original/android-full-page.png differ