我试图获取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)
答案 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%。这些将是较小的滚动条,但它必须在视口范围内,因此您可以尝试各种数字。
希望这会有所帮助。