diff --git a/src/main/java/io/github/lambdatest/utils/FullPageScreenshotUtil.java b/src/main/java/io/github/lambdatest/utils/FullPageScreenshotUtil.java index 0740e29..06d52cf 100644 --- a/src/main/java/io/github/lambdatest/utils/FullPageScreenshotUtil.java +++ b/src/main/java/io/github/lambdatest/utils/FullPageScreenshotUtil.java @@ -1,18 +1,21 @@ package io.github.lambdatest.utils; import io.appium.java_client.AppiumDriver; +import io.appium.java_client.PerformsTouchActions; +import io.appium.java_client.TouchAction; +import io.appium.java_client.touch.WaitOptions; +import io.appium.java_client.touch.offset.PointOption; import org.openqa.selenium.*; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; +import org.openqa.selenium.remote.RemoteWebElement; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.time.Duration; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.logging.Logger; public class FullPageScreenshotUtil { @@ -35,12 +38,12 @@ public FullPageScreenshotUtil(WebDriver driver, String saveDirectoryName) { private int samePageCounter = 1; //Init with value 1 , finalise at 3 private int maxCount = 10; public List captureFullPage(int pageCount) { - if(pageCount<=0){ - pageCount = maxCount; - } - if (pageCount < maxCount) { - maxCount = pageCount; - } + if(pageCount<=0){ + pageCount = maxCount; + } + if (pageCount < maxCount) { + maxCount = pageCount; + } int chunkCount = 0; boolean isLastScroll = false; List screenshotDir = new ArrayList<>(); @@ -75,31 +78,45 @@ private File captureAndSaveScreenshot(String ssDir, int index) { private void scrollDown() { Dimension screenSize = driver.manage().window().getSize(); int screenHeight = screenSize.getHeight(); + int screenWidth = screenSize.getWidth(); + // Define start and end points for scrolling int startX = 4; //start from 4 pixels from the left, to avoid click on action items/webview int startY = (int) (screenHeight * 0.70); // Start at 70% of the screen height int endY = (int) (screenHeight * 0.45); // Scroll up to 25% + int scrollHeight = startY - endY; try { - // Create a PointerInput action for touch gestures - PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger"); - Sequence swipe = new Sequence(finger, 0); + // Try iOS style swipe + JavascriptExecutor javascriptExecutorIos = (JavascriptExecutor) driver; + Map swipeObj = new HashMap<>(); + swipeObj.put("fromX", startX); + swipeObj.put("fromY", startY); + swipeObj.put("toX", startX); + swipeObj.put("toY", endY); + swipeObj.put("duration", 0.8); + javascriptExecutorIos.executeScript("mobile: dragFromToForDuration", swipeObj); - // Press (touch) at the start position - swipe.addAction(finger.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), startX, startY)); - swipe.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg())); - // Move to end position (scrolling) - swipe.addAction(finger.createPointerMove(Duration.ofMillis(500), PointerInput.Origin.viewport(), startX, endY)); - swipe.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg())); - if (driver instanceof AppiumDriver) { - AppiumDriver appiumDriver = (AppiumDriver) driver; - appiumDriver.perform(Collections.singleton(swipe)); - } else { - log.warning("Driver is not an instance of AppiumDriver"); - AppiumDriver appiumDriver = (AppiumDriver) driver; - appiumDriver.perform(Collections.singleton(swipe)); + } catch (Exception iosException) { + try { + // If iOS swipe fails, assume it's Android and do scrollGesture + JavascriptExecutor jsExecutorAndroid = (JavascriptExecutor) driver; + Map scrollParams = new HashMap<>(); + scrollParams.put("left", startX); + scrollParams.put("top", endY); + scrollParams.put("width", screenWidth - startX); + scrollParams.put("height", scrollHeight); + scrollParams.put("direction", "down"); + scrollParams.put("percent", 1.0); + scrollParams.put("speed", 2500); + jsExecutorAndroid.executeScript("mobile:scrollGesture", scrollParams); + } catch (Exception e) { + log.warning("Error during Android scroll operation: " + e.getMessage()); + e.printStackTrace(); } - // Allow time for UI to update + } + + try { Thread.sleep(1000); } catch (Exception e) { log.warning("Error during scroll operation: " + e.getMessage());