我正在网页上处理selenium webdriver脚本:http://data.worldbank.org/income-level/HIC
考虑这个实现:
public void retrieveCountryData() throws Exception{
Thread.sleep(2000);
WebDriverWait wait = new WebDriverWait(driver, 60);
List<WebElement> countryNames = driver.findElements(By.cssSelector("a[href*='/country/']"));
for(int i =76;i<countryNames.size();i++){
List<WebElement> countryLinks = driver.findElements(By.cssSelector("a[href*='/country/']"));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("a[href*='/country/']")));
Thread.sleep(3000);
WebElement elem =countryLinks.get(i);
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollTo(" + elem.getLocation().x + "," +(elem.getLocation().y- 100) + ");");
String countryText = elem.getText();
System.out.println("The Country is: "+ countryText);
elem.click();
wait.until(ExpectedConditions.visibilityOfElementLocated(countryDetailVerify));
Thread.sleep(2000);
driver.navigate().back();
}
此脚本有时会正确运行,而在其他时候,它会提供IndexOutOfBounds Excption。我已经运行了这个脚本10次,并且它运行了6次异常,并且运行了整个过程4次。
以下是异常的堆栈跟踪:
java.lang.IndexOutOfBoundsException: Index: 77, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at pageObjects.WorldBankData.retrieveCountryData(WorldBankData.java:172)
at testCases.SampleTest.getCTex(SampleTest.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774)
at org.testng.TestRunner.run(TestRunner.java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
at org.testng.SuiteRunner.run(SuiteRunner.java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1048)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:112)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:205)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:176)
at pageObjects.WorldBankData.retrieveCountryData(WorldBankData.java:172)
在我的剧本中引用WebElement elem =countryLinks.get(i);
。
有人可以告诉我为什么我会面对这个问题吗?
答案 0 :(得分:0)
很难说出你想要完成的事情。我清理了你的方法,并处理索引超出范围的异常。发生异常是因为当countryLinks.get(i)
等于大于i
总数的值时,将调用countryLinks
。因此,如果只有77个国家/地区,因为countryLinks.get(78)
调用了i=78
,那么就会抛出异常。
@Test
public void retrieveCountryData() throws Exception {
WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 15);
By countrySelector = By.cssSelector("a[href*='/country/']");
By countryDetailVerify = By.cssSelector("countryDetailVerify?");
driver.get("http://data.worldbank.org/income-level/HIC");
List<WebElement> countryNames = driver.findElements(countrySelector);
for (int i = 76; i < countryNames.size() - 1; i++) {
List<WebElement> countryLinks = driver.findElements(countrySelector);
wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(countrySelector));
WebElement elem = countryLinks.get(i);
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(" + elem.getLocation().x + "," + (elem.getLocation().y - 100) + ");");
String countryText = elem.getText();
System.out.println("The Country is: "+ countryText);
elem.click();
wait.until(ExpectedConditions.visibilityOfElementLocated(countryDetailVerify));
driver.navigate().back();
}
}