【问题标题】:Selenium TestNG - java.lang.NullPointerExceptionSelenium TestNG - java.lang.NullPointerException
【发布时间】:2014-09-25 06:36:57
【问题描述】:

我正在尝试测试 Gmail 的登录功能。但它显示异常错误 "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("abc@gmail.com");

            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

【问题讨论】:

  • 在第 33 行的 Gmail 类中有一个未实例化的变量。在这里您可能会遇到以下情况:该变量被应用程序上下文以某种方式实例化,而 TestNG 的上下文不知道它,或者 -由于某些情况,该变量为空,或者您只测试了部分代码,您只需要模拟该变量。

标签: java selenium selenium-webdriver testng


【解决方案1】:

您的测试注释不属于 TestNG。

替换

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

【讨论】:

  • :) 永远欢迎;请继续提问!
【解决方案2】:

在这段代码中sn -p @Test注解属于TestNg框架,@Before,@After注解属于Junit框架。 Eclipse 将显示作为 TestNG 测试运行(因为 Test 注释是从 TestNG 库导入的)如果你作为 TestNG 运行它,它不会执行 @Before 和 @After(因为它们属于 Junit 框架)因此 driver 变量是未初始化,所以我们得到 NullPointer 异常

我们要么导入 Junit Test 注解并作为 Junit 测试运行,要么将 @After & @Before 更改为 @AfterTest & @BeforeTest 并作为 TestNG 测试运行

【讨论】:

    【解决方案3】:
    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();
        }
    
        }
    

    【讨论】:

      【解决方案4】:

      始终检查您在代码中使用的import 语句,确保它始终是来自所需库的语句。可能存在相同方法在不同库的多个类中存在的情况。

      这里您使用的是JUnitimport 语句,而不是TestNg

      解决方案:-

      1. 使用 TestNG 导入语句。
      2. 使用@AfterTest 代替@After 注释。
      3. 使用@BeforeTest 代替@Before 注释。

      应该有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        相关资源
        最近更新 更多