2010-03-16 63 views
3

我想将常用方法分组到一个文件中并使用它。例如,使用硒登录页面可能会多次使用。在类A中定义并在类B中调用它。但是,它会引发空指针异常。发布硒代码维护

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

与所有其他Java语法

在B类

public void test_kk() throws Exception 
    { 

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

与所有的语法。

当我执行B类,我得到这个错误,

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) 

我希望有人必须有尝试过这一点。我可能会错过这里的东西。

+0

确保硒服务器已启动,并且在运行此代码之前启动硒浏览器 – 2010-03-16 08:55:20

+0

我已经完成了该操作。它打开浏览器,但没有把地址放在那里。 – Rajasankar 2010-03-16 09:17:50

+0

你可以添加你如何设置这个问题吗? – AutomatedTester 2010-03-16 11:14:06

回答

2

我们这样做的方式是,我们有辅助类和静态方法。在实际的测试案例中,我们设置了硒对象并将该对象传递给静态方法,以便它可以对其执行操作。

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 
    } 
} 

希望能够说明这一点。

除了更好的可读性和更容易的维护,您还可以通过创建两个(或更多)硒对象并在测试中传递这些对象来测试多用户行为。

1

硒对象是如何在A类中初始化的?你记得从B级创建的地方传入它吗?如果这是它的工作方式,那么很难看出代码的那一部分何时不包括在内......

+0

我不想在类A中初始化任何东西。只是代码的一部分在那里从类B调用。那是不正确的? – Rajasankar 2010-03-16 09:19:58

+0

我不知道,我看不到你发布的代码中的范围,但似乎如果你在B类中初始化硒对象,那么你必须以某种方式将它传递给类A(比如通过构造函数,也许)。 – AHM 2010-03-16 09:39:39

+0

对不起,也许这不清楚 - 我的意思是显然一些神奇的事情发生时,测试运行时,初始化SeleneseTestCase对象的Selenium属性。当您尝试从测试内部调用另一个类时,该属性未初始化,因此您必须从外部类传入selenium属性的值。 因此,向你的类添加一个参数一个构造函数用于初始化A中的selenium属性。从B开始,您将通过执行新的A(selenium)或其他东西来创建一个新的A. 如果这是所有问题:-) – AHM 2010-03-16 09:47:00