2010-03-16 62 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