2016-05-25 1 views
0

Je travaille sur le script WebDriver de sélénium sur une page Web: http://data.worldbank.org/income-level/HICIndexOutOfBounds exception se produit au hasard sur l'exécution de script WebDriver

Tenir compte de cette mise en œuvre:

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

Ce script fonctionne correctement parfois, et à d'autres moments, il donne IndexOutOfBounds Excption. J'ai exécuté ce script 10 fois, et 6 fois il a donné cette exception, et 4 fois il exécute tout son processus.

est la pile Après trace de l'exception:

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) fait référence à WebElement elem =countryLinks.get(i); dans mon script. Est-ce que quelqu'un peut me dire pourquoi je suis confronté à ce problème?

+1

Il semble que 'driver.findElements (By.cssSelector (" a [href * = '/ country /'] "));' renvoie parfois 0 éléments. – Zircon

+0

Peut-être parce que la taille de countryNames n'est pas plus grande que 76 parfois? –

+0

Y a-t-il quelque chose sur index = 77? Just is html code –

Répondre

0

Il est difficile de dire ce que vous essayez d'accomplir. J'ai nettoyé votre méthode et pris soin de l'exception de l'index hors limites. L'exception se produisait car countryLinks.get(i) était appelée lorsque i était égale à une valeur supérieure au nombre total de countryLinks. Donc s'il y avait seulement 77 pays, quand countryLinks.get(78) a été appelé parce que i=78 alors il lancerait l'exception.

@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(); 
    } 
} 
+0

Implémenter votre code, obtenant toujours l'exception IndexOutOfBound parfois. Se pourrait-il que ce soit lié à ma connexion Internet, d'où le problème de chargement de la page? – Uziii