0

Voici le code que j'ai écrit dans lequel j'utilise Windows handle pour valider l'ouverture de l'url après avoir cliqué sur un lien vers une nouvelle page.Erreur lors de l'utilisation de Windows Handle Selelnium

package pages; 

import java.io.IOException; 
import org.openqa.selenium.By; 
import org.testng.Assert; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.Test; 

import appSetup_Maven.test.BaseClass; 

public class HelpCenter extends BaseClass { 

    @Test 
    public void Kb() throws IOException { 
     Login(); 
     driver.findElement(By.xpath(".//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/a")).click(); 

     Object[] handle = driver.getWindowHandles().toArray(); 

     driver.findElement(By.xpath(".//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/ul/li[4]/a")).click(); 
     driver.switchTo().window((String) handle[0]); 
     String URL = driver.getCurrentUrl(); 
     System.out.println(URL); 
     Assert.assertEquals(URL, "https://preprod.xyz.com/home"); 
     driver.switchTo().window((String) handle[1]); 
     driver.getTitle(); 
     Assert.assertEquals(URL, "https://kb.xyz.com/"); 
    } 

} 

Cependant, le code ci-dessus ne fonctionne pas à elle échoue et donne l'erreur ci-dessous -

java.lang.ArrayIndexOutOfBoundsException: 1 
    at pages.HelpCenter.Kb(HelpCenter.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:661) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 
    at org.testng.TestRunner.privateRun(TestRunner.java:744) 
    at org.testng.TestRunner.run(TestRunner.java:602) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:289) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226) 
    at org.testng.TestNG.runSuites(TestNG.java:1144) 
    at org.testng.TestNG.run(TestNG.java:1115) 
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76) 

Répondre

0

En tant qu'ingénieur de test, mon premier point est de connaître le sens de l'erreur et a causé. Il peut être facilement débogué en utilisant la traceback fournie par l'EDI. Vous devez vous référer à la documentation, puis essayez d'appliquer la logique pour expliquer pourquoi elle a échoué. Maintenant, si je vois votre code, l'exception qui vient ArrayIndexOutOfBoundsException. Selon la documentation de Oracle, voici ce qu'ils disent au sujet ArrayIndexOutOfBoundsException

Jeté pour indiquer qu'un tableau a été consultée avec un index illégal. L'index est soit négatif ou supérieur ou égal à la taille du tableau.

Et, votre retraçage, suggère, c'est à la ligne 25

 at pages.HelpCenter.Kb(HelpCenter.java:25) 

qui indique à ce morceau de code

 driver.switchTo().window((String) handle[1]); 

Le tableau que vous avez créé ne élément n'a pas à l'index 1, et ainsi il jette cette erreur.

Les raisons peuvent inclure -

  1. Vous ne donnez pas assez de temps pour WebDriver de reconnaître la fenêtre. Je suggère d'ajouter un Wait après avoir cliqué sur l'élément web, avant de passer à la fenêtre. Utilisation d'un tableau Object pour obtenir les fenêtres. Vous obtenez un tableau d'objets, puis en le convertissant en String? Pourquoi donc? À moins qu'il y ait un besoin d'être converti en objets, je ne pense pas que vous ayez besoin d'un tableau d'objets. Vous pouvez simplement utiliser String pour les poignées de la fenêtre elle-même. Essayez de simplifier votre code.

Vous pouvez utiliser quelque chose comme

 String parentWindowHandler = driver.getWindowHandle(); 
     String subWindowHandler = null; 

     Set<String> handles = driver.getWindowHandles(); 
     Iterator<String> iterator = handles.iterator(); 
     while (iterator.hasNext()) 
    { 
     subWindowHandler = iterator.next(); 
     driver.switchTo().window(subWindowHandler); 

     System.out.println(subWindowHandler); 
     } 


     driver.switchTo().window(parentWindowHandler); 

Voici un excellent post sur IndexOutOfBoundsException.

+0

merci pour la solution et les idées. –