2014-09-25 103 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注解。

它应该帮助!

相关问题