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

时间:2018-10-17 10:34:02

标签: java selenium-webdriver appium appium-android

enter image description here
我试图获取Year数据列表并将其存储在list变量中,但是无法存储所有数据。

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

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

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

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(RemoteTestNG.java:251)     在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

2 个答案:

答案 0 :(得分:2)

错误显示“ java.lang.IndexOutOfBoundsException:长度为7的索引7越界”。要解决此问题,请更正for循环,如下所示(“ <” insdead of“ <=”)。代码如下:

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

修改后的代码可返回显示年份的列表。 (注意:代码可能可以优化为具有单个循环。由于滚动逻辑不清楚,我将其保持原样)

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;
}

答案 1 :(得分:1)

列表数组将仅返回您请求列表数组时设备上显示的内容。

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

在该列表中搜索匹配项时,如果没有找到匹配项,则需要调用滚动例程(我将稍作讨论),然后完全重新阅读该列表,然后再次开始搜索,但是在开始搜索列表之前,还需要确保再次阅读的列表与已经存在的列表不同。您只需检查列表中的最后一项即可。如果它与上一个列表中的最后一个项目相同,则您已到达末尾并可以在找不到条件的情况下退出循环。

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

希望这会有所帮助。