2010-03-16 3 views
3

Je souhaite regrouper les méthodes courantes dans un seul fichier et l'utiliser. Par exemple, se connecter à une page en utilisant le sélénium peut être utilisé plusieurs fois. Définissez cela dans la classe A et appelez-le dans la classe B. Cependant, il déclenche une exception de pointeur null.Problème de maintenance du code sélénium

classe A a

public void test_Login() throws Exception 
    { 
     try{ 
     selenium.setTimeout("60000"); 
     selenium.open("http://localhost"); 
     selenium.windowFocus(); 
     selenium.windowMaximize(); 
     selenium.windowFocus(); 
     selenium.type("userName", "admin"); 
     selenium.type("password", "admin"); 
     Result=selenium.isElementPresent("//input[@type='image']"); 
     selenium.click("//input[@type='image']"); 
     selenium.waitForPageToLoad(Timeout); 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex); 
      ex.printStackTrace(); 
     } 
    } 

avec tout autre syntaxe java

en classe B

public void test_kk() throws Exception 
    { 

     try 
     { 
      a.test_Login(); 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex); 
      ex.printStackTrace(); 
     } 
    } 

avec toute syntaxe.

Quand je classe B exercerai, je suis arrivé cette erreur,

java.lang.NullPointerException 
     at A.test_Login(A.java:32) 
     at B.test_kk(savefile.java:58) 
     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 junit.framework.TestCase.runTest(TestCase.java:168) 
     at junit.framework.TestCase.runBare(TestCase.java:134) 
     at com.thoughtworks.selenium.SeleneseTestCase.runBare(SeleneseTestCase.j 
ava:212) 
     at junit.framework.TestResult$1.protect(TestResult.java:110) 
     at junit.framework.TestResult.runProtected(TestResult.java:128) 
     at junit.framework.TestResult.run(TestResult.java:113) 
     at junit.framework.TestCase.run(TestCase.java:124) 
     at junit.framework.TestSuite.runTest(TestSuite.java:232) 
     at junit.framework.TestSuite.run(TestSuite.java:227) 
     at junit.textui.TestRunner.doRun(TestRunner.java:116) 
     at junit.textui.TestRunner.doRun(TestRunner.java:109) 
     at junit.textui.TestRunner.run(TestRunner.java:77) 
     at B.main(B.java:77) 

J'espère que quelqu'un doit avoir essayé avant. Je peux manquer quelque chose ici.

+0

Assurez-vous que le serveur Selenium est démarré et que vous démarrez le navigateur Selenium avant d'exécuter ce code –

+0

Je l'ai fait. Il ouvre le navigateur, mais ne parvient pas à y mettre l'adresse. – Rajasankar

+0

Pouvez-vous ajouter comment vous faites l'installation à cette question? – AutomatedTester

Répondre

2

De la manière dont nous le faisons, nous avons des classes auxiliaires avec des méthodes statiques. Dans les cas de test réels, nous configurons notre objet sélénium et transmettons l'objet à la méthode statique afin qu'il puisse fonctionner sur celui-ci.

public BaseHelper 
{ 
    public static login(final String username, final String password, final DefaultSelenium selenium) 
    { 
    selenium.type("userName", username); 
    selenium.type("password", password); 
    selenium.click("loginbutton"); 
    } 
} 


public LoginTest 
{ 
    DefaultSelenium selenium; 

    onSetup() 
    { 
     selenium = new DefaultSelenium(...); 
    } 

    public testLogin() 
    { 
     BaseHelper.login("admin", "admin", selenium); 
     // assert that this passed 
     BaseHelper.login("foo", "bar", selenium); 
     // assert this failed because no user 'foo' 
     BaseHelper.login("admin", "bar", selenium); 
     // assert this failed because admin's password was incorrect 
    } 
} 

Espérons que cela illustre le point. En plus de la meilleure lisibilité et de la facilité de maintenance, vous pouvez également tester le comportement multi-utilisateur en créant deux (ou plus) objets sélénium et les transmettre dans les tests.

1

Comment l'objet sélénium est-il initialisé dans la classe A? Vous souvenez-vous de le passer d'où il a été créé en classe B? Si c'est comme ça que ça fonctionne, c'est difficile à voir quand cette partie du code n'est pas incluse ...

+0

Je ne veux pas initialiser quoi que ce soit dans la classe A. Juste la partie du code est là pour appeler de la classe B. Est-ce incorrect? – Rajasankar

+0

Je ne sais pas, je ne vois pas les étendues dans le code que vous avez posté, mais il semble que si vous initialisez l'objet sélénium dans la classe B, alors vous devez le passer à la classe A (comme par le constructeur, peut être). – AHM

+0

Désolé, peut-être que ce n'était pas clair - je veux dire apparemment une certaine magie se produit l'initialise la propriété sélénium d'un objet qui étend SeleneseTestCase lorsque le test est exécuté. Lorsque vous essayez d'appeler une autre classe à l'intérieur du test, cette propriété n'est pas initialisée et vous devez donc transmettre la valeur de la propriété sélenium de la classe externe. Ajoutez donc un argument à votre constructeur de classe A, une utilisation pour initialiser la propriété sélénium dans A. A partir de B, vous créez un nouvel A en faisant un nouveau A (sélénium) ou quelque chose. Si c'est le problème du tout :-) – AHM

Questions connexes