如何在Appium中获取和存储列表数据以及如何点击特定的搜索记录

How To Fetch And Store List Data In Appium And How To Click On Particular Searched Record


我正在尝试获取年份数据列表并将其存储在列表变量中,但无法存储所有数据。

同时我也想搜索特定年份,如果找不到年份,我想滚动并在列表中再次搜索。

我还附上了我在应用程序中的元素的屏幕截图。

这是我在列表变量中存储和搜索记录列表的代码

public void fetchVehicleListAndClickOnYear(String year) {

        java.util.List<MobileElement> vehicleList =driver.findElementsById(packageName+":id/title"); 

        for (int i=0;i<= vehicleList.size();i++) {
            String actuallist = vehicleList.get(i).getText();
            System.out.println("Print vehicle year list " +actuallist);
            if(actuallist.equals(year)) {
                driver.findElementByName(year).click();
            } else {
                Utils.scrollDown(driver);
            }
        }
    }

    public void fillVehicleInfoOnSignup(String Vehicle_Year) {

        vehicleYearTextBox.click();
        Utils.PauseTestExecution(2);
        fetchVehicleListAndClickOnYear(Vehicle_Year);

    }



For scrolling code 

public static void scrollDown(AndroidDriver<MobileElement> driver) {
            //if pressX was zero it didn't work for me
            int pressX = driver.manage().window().getSize().width / 2;
            // 4/5 of the screen as the bottom finger-press point
            int bottomY = driver.manage().window().getSize().height * 4/5;
            // just non zero point, as it didn't scroll to zero normally
            int topY = driver.manage().window().getSize().height / 8;
            //scroll with TouchAction by itself
            scroll(pressX, bottomY, pressX, topY,driver);
        }

        public static void scroll(int fromX, int fromY, int toX, int toY,AndroidDriver<MobileElement> driver) {
            TouchAction touchAction = new TouchAction(driver);
            new TouchAction(driver).press(PointOption.point(fromX, fromY)).waitAction().moveTo(PointOption.point(toX, toY)).release().perform();
        }

显示错误

警告:发生了非法的反射访问操作 警告:net.sf.cglib.core.ReflectUtils$1(文件:/Users/daffolapmac-73/eclipse-workspace/Wapanda_Driver_Automation/libfiles/cglib-3.2.8.jar)对方法 java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int 的非法反射访问,java.security.ProtectionDomain) 警告:请考虑将此报告给 net.sf.cglib.core.ReflectUtils$1 的维护者 警告:使用 --illegal-access=warn 启用进一步非法反射访问操作的警告 警告:所有非法访问操作将在未来的版本中被拒绝 打印车辆年表2018 打印车辆年表 2000 打印车辆年表 1984 打印车辆年表 1967 打印车辆年表 1952 打印车辆年表 1942 打印车辆年表 1941 java.lang.IndexOutOfBoundsException:索引 7 越界,长度为 7 在 java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 在 java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 在 java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) 在 java.base/java.util.Objects.checkIndex(Objects.java:372) 在 java.base/java.util.ArrayList.get(ArrayList.java:440) 在 com.wapanda.pages.DriverSignUpPages.fetchVehicleListAndClickOnYear(DriverSignUpPages.java:261) 在 com.wapanda.pages.DriverSignUpPages.fillVehicleInfoOnSignup(DriverSignUpPages.java:275) 在 com.wapanda.tests.ValidateDriverProcess.validateDriverSignupProcess(ValidateDriverProcess.java:108) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:564) 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) 在 org.testng.internal.Invoker.invokeMethod(Invoker.java:580) 在 org.testng.internal.Invoker.invokeTestMethod(Invoker.java:716) 在 org.testng.internal.Invoker.invokeTestMethods(Invoker.java:988) 在 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 在 org.testng.TestRunner.privateRun(TestRunner.java:648) 在 org.testng.TestRunner.run(TestRunner.java:505) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:455) 在 org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) 在 org.testng.SuiteRunner.run(SuiteRunner.java:364) 在 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1208) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1137) 在 org.testng.TestNG.runSuites(TestNG.java:1049) 在 org.testng.TestNG.run(TestNG.java:1017) 在 org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) 在 org.testng.remote.RemoteTestNG.initAndRun(远程TestNG.java:251) 在 org.testng.remote.RemoteTestNG.main(远程TestNG.java:77)

列表数组只会return您请求列表数组时设备上显示的内容。

在您的示例中,显示了 2018 年到 2012 年的日期,因此当您初始化列表时,它将仅包含这些元素。

当您在该列表中搜索匹配项并找到 none 时,您需要调用滚动例程(我稍后会谈到),然后重新完整读取列表,并重新开始搜索,但在开始搜索列表之前,您还需要确保您再次读入的列表与已经存在的列表不同。您可以通过简单地检查列表中的最后一项来做到这一点。如果它与上一个列表中的最后一项相同,则您已到达末尾,可以以未找到条件退出循环。

另一件事是你的滚动例程,你似乎试图从高度的 80% 滚动到高度的 20%(4/5 和 1/8),但列表本身只占屏幕的一半,下半部分。我建议您将起始 y 位置设为 80% 或 90%,然后滚动到 70% 或 60%。这些将是较小的卷轴,但它需要在视口范围内,因此您可以尝试各种数字。

希望这对您有所帮助。

错误说 "java.lang.IndexOutOfBoundsException: Index 7 out-of-bounds for length 7"。要修复它,请按以下方式更正 for 循环(“<”代替“<=”)。代码如下所示:

for (int i=0;i<vehicleList.size();i++) {
            String actuallist = vehicleList.get(i).getText();

https://docs.oracle.com/javase/7/docs/api/java/lang/IndexOutOfBoundsException.html

将代码修改为 return 显示年份列表。 (注意:代码可能会被优化为具有单个循环。由于滚动逻辑不明确,我保持原样)

public List<String> fetchVehicleListAndClickOnYear(String year) {

    java.util.List<MobileElement> vehicleList =driver.findElementsById(packageName+":id/title");

    java.util.List<String> displayedYears = new ArrayList<>();
    //logic to add displayed years to list
    for (MobileElement yearEl: vehicleList) {
        displayedYears.add(yearEl.getText());
    }

    //logic to click
    for (int i=0;i< vehicleList.size();i++) {
        String actuallist = vehicleList.get(i).getText();
        System.out.println("Print vehicle year list " +actuallist);
        if(actuallist.equals(year)) {
            driver.findElementByName(year).click();
        } else {
            Utils.scrollDown(driver);
        }
    }
    return displayedYears;
}