2014-09-25 38 views
-2

我試圖測試Gmail的登錄功能。但它會顯示一個異常錯誤「java.lang.NullPointerException」。代碼如下:Selenium TestNG - java.lang.NullPointerException

package gmail; 

    import java.util.concurrent.TimeUnit; 

    import org.junit.After; 
    import org.junit.Before; 
    import org.openqa.selenium.By; 
    import org.openqa.selenium.WebDriver; 
    import org.openqa.selenium.WebElement; 
    import org.openqa.selenium.chrome.ChromeDriver; 
    import org.testng.annotations.Test; 

    public class Gmail { 
     WebDriver driver; 

     @Before 
     public void setup() { 
     System.setProperty("webdriver.chrome.driver","E://chromedriver.exe"); 
     driver=new ChromeDriver(); 
     driver.get("https://accounts.google.com/"); 
     driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS); 
     } 

     @After 
     public void quit() { 
      driver.manage().deleteAllCookies(); 
      driver.quit(); 
     } 

     @Test() 
     public void login() { 

      WebElement txtUserName=driver.findElement(By.name("Email")); 
      txtUserName.sendKeys("[email protected]"); 

      WebElement txtPassword=driver.findElement(By.name("Passwd")); 
      txtPassword.sendKeys("abcd123"); 

      WebElement btnLogin=driver.findElement(By.name ("signIn")); 
      btnLogin.submit(); 
      } 
    } 

錯誤:

FAILED: login 
java.lang.NullPointerException 
    at gmail.Gmail.login(Gmail.java:33) 
    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:84) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
    at org.testng.TestRunner.privateRun(TestRunner.java:767) 
    at org.testng.TestRunner.run(TestRunner.java:617) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:335) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:330) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) 
    at org.testng.TestNG.run(TestNG.java:1057) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 

============================ =================== 默認測試

測試運行:1,故障:1,跳過:0

+0

有類Gmail中的非實例變量,上線33在這裏,你可能有這些情況:該變量在某種程度上由應用程序上下文實例化,TestNG的背景是沒有意識到這一點,或者 - 變量爲空,因爲在某些情況下,或者只測試部分代碼,您只需簡單地模擬該變量即可。 – 2014-09-25 06:44:12

回答

3

您的測試註釋不屬於TestNG的。

替換

@Before with @BeforeTest 
@After with @AfterTest 
@Test should point TestNG library 
+0

謝謝Prashanth – Chamindi 2014-09-25 08:03:53

+0

:)總是歡迎;請繼續提問! – 2014-09-25 08:04:30

1

在該代碼段@Test註解屬於TestNG的框架和@Before,@After註釋屬於JUnit框架。 Eclipse會顯示運行的TestNG的測試(因爲測試註釋從TestNG的庫中導入),如果你運行它TestNG的,它不會執行所@Before和@After(因爲它們屬於JUnit框架),因此驅動變量沒有被初始化,所以我們是獲得空指針異常

要麼我們應導入JUnit測試註釋和運行作爲JUnit測試或更改@After & @Before到@AfterTest & @BeforeTest和運行的TestNG的測試

1
package selenium; 

import java.io.File; 
import java.io.IOException; 
import java.util.concurrent.TimeUnit; 
import static org.testng.Assert.assertEquals; 

import org.openqa.selenium.By; 
import org.openqa.selenium.NoSuchElementException; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.Test; 

import jxl.Sheet; 
import jxl.Workbook; 
import jxl.read.biff.BiffException; 

public class Aply_login { 

WebDriver d; 
private By by; 
    @Test 
    public void aplylogin() throws BiffException, IOException, InterruptedException{ 

     d.get("http://multishop.orderzen.com/customer/account/login/"); 
     assertEquals("Customer Login | Multishop",d.getTitle()); 

File f = new File("F:\\workspace locaiton\\page object model\\aplyinputs.xls"); 
Workbook w = Workbook.getWorkbook(f); 
Sheet s = w.getSheet("Sheet1"); 


    for(int i=0;i<s.getRows();i++) {  

      //User name 
     d.findElement(By.id("email")).clear();  
     d.findElement(By.id("email")).sendKeys(s.getCell(0,i).getContents()); 
     String uname = d.findElement(By.id("email")).getAttribute("value"); 

     //Password 
     d.findElement(By.id("pass")).clear(); 
     d.findElement(By.id("pass")).sendKeys(s.getCell(1,i).getContents()); 
     String pass = d.findElement(By.id("pass")).getAttribute("value"); 

     //submit 
     d.findElement(By.id("send2")).click(); 

//Blank user name and blank password (1) 
     if (uname.equals("") && pass.equals("")) { 
      d.findElement(By.id("advice-required-entry-email")); 
      d.findElement(By.id("advice-required-entry-pass")); 
      Thread.sleep(6000);enter code here 
     } 
//Blank user name and valid/invalid password (2)    
     else if(uname.equals("")){ 
      d.findElement(By.id("advice-required-entry-email")); 
     Thread.sleep(6000); 
     } 


//invalid user name blank password (3)  
    else if(isElementPresent(d,By.xpath(".//*[@id='advice-validate-email-email']"),By.xpath(".//*[@id='advice-required-entry-pass']"))) 
    { 
     d.findElement(By.xpath(".//*[@id='advice-validate-email-email']")); 
     d.findElement(By.xpath(".//*[@id='advice-required-entry-pass']")); 
     Thread.sleep(6000); 
    } 
//valid user name & password (4) 
    else if(isElementPresent(d,By.linkText("Log Out"))) { 
     d.findElement(By.linkText("Log Out")).click(); 
     Thread.sleep(6000); 
    } 
//Invalid user & password (5) 
    else if(isElementPresent(d,By.id("advice-validate-email-email"),By.id("advice-validate-password-pass"))) { 
     d.findElement(By.id("advice-validate-email-email")); 
     d.findElement(By.id("advice-validate-password-pass")); 
     Thread.sleep(6000); 
    } 


    else if(isElementPresent(d,By.cssSelector("span..firepath-matching-node"))) { 
     d.findElement(By.cssSelector("span..firepath-matching-node")); 
    } 
    } 



    } 

private boolean isElementPresent(WebDriver d2, By linkText) { 
    d.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
    try{ 
     d.findElement(by); 
     return true; 
    } 
    catch(NoSuchElementException e) { 
     return false; 
    } 
    } 




private boolean isElementPresent(WebDriver d2, By xpath, By xpath2) { 
    d.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
    try { 
     d.findElement(by); 
     return true; 
    } 
    catch(NoSuchElementException e){  

     return false; 
    } 

} 


@BeforeMethod 
    public void setUp() 
    { 
    // Launch browser 
      d=new FirefoxDriver(); 
     //System.setProperty("webdriver.chrome.driver","F:\\lib\\chromedriver.exe"); 
     //d =new ChromeDriver(); 
    // Maximize window 
    d.manage().window().maximize(); 
    d.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); 
    } 
    @AfterMethod 
    public void tearDown() 
    { 
    // Close browser 
    d.quit(); 
    } 

    } 
0

經常檢查import語句你正在使用你的代碼,確保它總是來自de圖書館。可能會出現同一方法從不同庫中的多個類中退出的情況。

這裏您使用的是import陳述JUnit而不是TestNg

解決方案: -

  1. 使用TestNG的import語句。
  2. 使用@AfterTest代替@After註解。
  3. 使用@BeforeTest代替@Before註解。

它應該幫助!

相關問題