Исключение IndexOutOfBounds происходит случайным образом при выполнении сценария webdriver

Я работаю над сценарием 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);на мой скрипт.

Может ли кто-то сказать мне, почему я сталкиваюсь с этой проблемой?

1 ответ

  1. Трудно сказать, чего вы пытаетесь достичь. Я очистил ваш метод и позаботился об исключении индекса за пределами границ. Исключение происходило потому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();
        }
    }