Skip to content

[DOT-4925] Changes in scroll for supporting appium version downgrade to support GS integration #34

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 22, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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<File> 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<File> screenshotDir = new ArrayList<>();
Expand Down Expand Up @@ -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<String, Object> 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<String, Object> 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());
Expand Down