提问者:小点点

cucumber StepDifinition处的空指针异常


我正在使用cucumber的BDD和TestNG,但是在我的步骤中得到了NullPointerException。

我试过这里建议的许多东西,但都没用。

请帮帮我,我真的不知道是什么引起了这个错误

作为基本页的运行程序文件:

package main;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

import com.google.common.io.Files;
import com.relevantcodes.extentreports.LogStatus;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;

import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;
//import helpers.ReportHelper;
import io.cucumber.testng.TestNGCucumberRunner;
import ptest.utilities.ExtentTestManager;
import ptest.utilities.ReadExcel;

@CucumberOptions(strict = true, 
                monochrome = true, 
                features = "src/test/resources/features", 
                glue = "stepdefinition", 
                //format = {"pretty","json:target/cucumber.json"}, 
                tags = { "@TC001" }
                        )

public class CucumberRunner extends AbstractTestNGCucumberTests {

    public static WebDriver driver;
    public WebDriverWait wait;
    public static Properties prop;
    public  static EventFiringWebDriver e_driver;
    public static WebElement webelement;
    public static List<WebElement> webelements = null;
    public static int defaultBrowserTimeOut = 30000;
    public static List<String> windowHandlers;
    public static ReadExcel readExcel;



    public static WebDriver GoToURL(String browserName, String url)throws UnknownHostException {

        //deleteTempFile();

        if (browserName.equalsIgnoreCase("firefox")) {
            System.setProperty("webdriver.gecko.driver",System.getProperty("user.dir") + "\\geckodriver.exe");
            /*  DesiredCapabilities capabilities = DesiredCapabilities.firefox();
                capabilities.setCapability("marionette", true);
                Webdriver driver = new FirefoxDriver(capabilities);*/
            driver = new FirefoxDriver();
            driver.get(url);
        } else if (browserName.equalsIgnoreCase("iexplorer")) {
            System.setProperty("webdriver.ie.driver",
                    System.getProperty("user.dir") + "\\IEDriverServer.exe");
            /*  DesiredCapabilities capabilities = DesiredCapabilities.

            capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
            capabilities.setCapability("ignoreZoomSetting", true);*/
            driver = new InternetExplorerDriver();
        } else if (browserName.equalsIgnoreCase("chrome")) {
            System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") +"\\lib\\chromedriver.exe");               
            driver = new ChromeDriver(); 
            driver.get(url);
        }

        driver.manage().timeouts().implicitlyWait(defaultBrowserTimeOut, TimeUnit.MILLISECONDS);
        driver.manage().deleteAllCookies();

        if (browserName.equalsIgnoreCase("iexplorer"))
            SwitchToAlert();

        if (windowHandlers == null)
            windowHandlers = new LinkedList<String>();
        else
            windowHandlers.clear();

        windowHandlers.add(driver.getWindowHandle());
        driver.manage().window().maximize();
        return driver;

    }
    @BeforeMethod
    public static WebDriver getDriver() {
        return driver;
    }
    /*  
     * @AfterMethod public static void shutDownDriver() { if (driver != null)
     * driver.quit(); }
     */



    /**

     * @param driver
     * @param element
     */
    public static void highlightElement(WebDriver driver, WebElement element) {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("arguments[0].setAttribute('style', arguments[1]);",
                element, "border: 2px solid DeepPink;");
    }


    /**

     * @param locator in particular format mentioned
     * @return WebElement
     */
    public static WebElement findElement(String locator) {

        //Locator Values are Expected in string format like "name==abc" or "id==pqr" or "xpath==//*[@id='uname']"

        if (locator != null) {
            String[] arrLocator = locator.split("==");
            String locatorTag = arrLocator[0].trim();
            String objectLocator = arrLocator[1].trim();
            try {
                if (locatorTag.equalsIgnoreCase("id")) {
                    webelement = driver.findElement(By.id(objectLocator));
                    //highlightElement(driver, webelement);
                } else if (locatorTag.equalsIgnoreCase("name")) {
                    webelement = driver.findElement(By.name(objectLocator));
                    //highlightElement(driver, webelement);
                } else if (locatorTag.equalsIgnoreCase("xpath")) {
                    webelement = driver.findElement(By.xpath(objectLocator));
                    //highlightElement(driver, webelement);
                } else if (locatorTag.equalsIgnoreCase("linkText")) {
                    webelement = driver.findElement(By.linkText(objectLocator));
                    //highlightElement(driver, webelement);
                } else if (locatorTag.equalsIgnoreCase("class")) {
                    webelement = driver
                            .findElement(By.className(objectLocator));
                    //highlightElement(driver, webelement);
                } else if (locatorTag.equalsIgnoreCase("css")) {
                    webelement = driver.findElement(By
                            .cssSelector(objectLocator));
                    //highlightElement(driver, webelement);
                } else {
                    String error = "Please Check the Given Locator Syntax :"
                            + locator;
                    error = error.replaceAll("'", "\"");

                    return null;
                }
            } catch (Exception e) {
                ExtentTestManager.getTest().log(LogStatus.FAIL, "Failure Reason:- "+e.getMessage());
                Assert.assertTrue(false);
                String error = "Please Check the Given Locator Syntax :"
                        + locator;
                error = error.replaceAll("'", "\"");
                e.printStackTrace();
                return null;                

            }
        }

        return webelement;
    }




    //Click Method
    public void click(By elementLocation) {
        waitVisibility(elementLocation);
        driver.findElement(elementLocation).click();
    }

    //Write Text
    public void writeText(By elementLocation, String text) {
        waitVisibility(elementLocation);
        driver.findElement(elementLocation).sendKeys(text);
    }

    //Read Text
    public String readText(By elementLocation) {
        waitVisibility(elementLocation);
        return driver.findElement(elementLocation).getText();
    }

    //Wait
    public void waitVisibility(By by){
        wait.until(ExpectedConditions.visibilityOfElementLocated(by));      
    }
    public WebElement findByClassName(String ClassName) {
        WebElement element = driver.findElement(By.className(ClassName));

        return element;
    }




    /**
     * Find WebElement By CssSelector.
     *
     * @param CssSelector
     * @return Return Web Element.
     */
    public WebElement findByCssSelector(String CssSelector) {
        WebElement element = driver.findElement(By.cssSelector(CssSelector));

        return element;
    }

    /**

     * @param locator
     * desc Whether the checkbox is checked or not 
     */
    public static boolean isCheckboxChecked(String locator) {
        WebElement element = findElement(locator);
        if (element.isSelected())
            return true;
        else
            return false;
    }

    /**

     * * @param locator
     * @return list of webelement found
     */
    public static List<WebElement> findElements(String locator) {

        if (locator != null) {
            String[] arrLocator = locator.split("==");
            String locatorTag = arrLocator[0].trim();
            String objectLocator = arrLocator[1].trim();

            if (locatorTag.equalsIgnoreCase("id")) {
                webelements = driver.findElements(By.id(objectLocator));
            } else if (locatorTag.equalsIgnoreCase("name")) {
                webelements = driver.findElements(By.name(objectLocator));
            } else if (locatorTag.equalsIgnoreCase("xpath")) {
                webelements = driver.findElements(By.xpath(objectLocator));
            } else if (locatorTag.equalsIgnoreCase("linkText")) {
                webelements = driver.findElements(By.linkText(objectLocator));
            } else if (locatorTag.equalsIgnoreCase("class")) {
                webelements = driver.findElements(By.className(objectLocator));
            } else {
                System.out.println("Please Check the Locator Syntax Given :"
                        + locator);
                return null;
            }
        }
        return webelements;
    }

    /**

     * @param locator
     * desc Check a Checkbox having a particular value as its attribute 
     */
    public static void CheckCheckBox(String Locator, String Value)
    {
        List<WebElement> oCheckBox = findElements(Locator);


        // This will tell you the number of checkboxes are present

        int iSize = oCheckBox.size();

        // Start the loop from first checkbox to last checkbox

        for(int i=0; i < iSize ; i++ ){

            // Store the checkbox name to the string variable, using 'Value' attribute

            String sValue = oCheckBox.get(i).getAttribute("value");

            // Select the checkbox it the value of the checkbox is same what you are looking for

            if (sValue.equalsIgnoreCase(Value))
            {

                oCheckBox.get(i).click();

                // This will take the execution out of for loop

                break;

            }

        }
    }


    /**
     * ram ID
     * <p>
     * Find Web Element By ID.
     *
     * @paturn Return Web Element.
     */
    public WebElement findById(String ID) {
        WebElement element = driver.findElement(By.id(ID));

        return element;
    }

    /**

     * @throws AWTException 
     */
    public static void PressShiftTab() throws AWTException {
        Robot robot = new Robot();
        robot.delay(3000);
        robot.keyPress(KeyEvent.VK_SHIFT);
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB); 
        robot.keyRelease(KeyEvent.VK_SHIFT);
    }

    /**

     * @throws AWTException 
     */
    public static void PressTab() throws AWTException {
        Robot robot = new Robot();
        robot.delay(3000);

        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB); 

    }
    /**

     * @param locator of the Web Element
     * @param attributeName
     * @return attributeValue
     */
    public static String getAttribute(String locator, String attributeName) {
        String attributeValue = null;
        try {

            WebElement element = findElement(locator);
            if (element != null)
                attributeValue = element.getAttribute(attributeName);
            element = null;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return attributeValue;
    }

    /**

     * @param locator of the Element to be cleared
     */
    public static void clearElement(String locator) {
        try {

            WebElement element = findElement(locator);
            element.clear();
            element = null;
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    /**

     * @param locator
     * @param value
     */
    public static void enterText(String locator, String value) {

        try {

            WebElement element = findElement(locator);
            element.sendKeys(value);
            element = null;
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**

     * @param locator of Element to be clicked
     * @return 
     */
    public static  void click(String locator) {
        try {
            WebElement element = findElement(locator);
            if (element != null)
                element.click();
            else
                System.out.println("Element Is NULL");
            element = null;     
            /*Assert.assertTrue(false);*/

        } catch (Exception e) {

            System.out.println(" Error occured whlie click on the element "
                    + locator + " *** " + e.getMessage());
            ExtentTestManager.getTest().log(LogStatus.FAIL, "Failure Reason:- "+e.getMessage());
            Assert.assertTrue(false);
        }
    }

    /**

     * @param locator
     * @return Text/value of the Element
     */
    public static String getElementText(String locator) {
        WebElement element;
        String text = null;
        try {
            element = findElement(locator);
            if (element != null)

                text = element.getText();

        } catch (Exception e) {
            e.printStackTrace();
            ExtentTestManager.getTest().log(LogStatus.FAIL, "Failure Reason:- "+e.getMessage());
            Assert.assertTrue(false);
        }
        element = null;

        return text;
    }

    /**

     * @param propertyType
     * @param propertyValue
     */
    public static void mouseHover(String locator) {

        WebElement mouseOverElement = findElement(locator);
        Actions builder = new Actions(driver);  // Configure the Action    
        Action mouseOver =builder.moveToElement(mouseOverElement).build(); // Get the action    
        mouseOver.perform(); // Execute the Action 
    }

    /**
     * Find Web Element By findByLinkText.
     *
     * @param linkText
     * @return Return Web Element.
     */
    public WebElement findByLinkText(String linkText) {
        WebElement element = driver.findElement(By.linkText(linkText));

        return element;
    }

    /**
     * Find Web Element By Name.
     *
     * @param Name
     * @return Return Web Element.
     */
    public WebElement findByName(String Name) {
        WebElement element = driver.findElement(By.name(Name));

        return element;
    }

    /**
     * Find Web Element By Partial_Link_Text.
     *
     * @param PartialLinkText
     * @return Return Web Element.
     */
    public WebElement findByPartialLinkText(String PartialLinkText) {
        WebElement element = driver.findElement(By.partialLinkText(PartialLinkText));

        return element;
    }

    /**
     * Find Web Element By Tag_Name.
     *
     * @param TagName
     * @return Return Web Element.
     */
    public WebElement findByTagName(String TagName) {
        WebElement element = driver.findElement(By.tagName(TagName));

        return element;
    }

    /**
     * Find Web Element By findByXpath.
     *
     * @param XpathExpression
     * @return Return Web Element.
     */
    public WebElement findByXpath(String XpathExpression) {
        WebElement element = driver.findElement(By.xpath(XpathExpression));

        return element;
    }










}

步骤定义:

package stepdefinition;

import java.lang.reflect.Method;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.ITestContext;

import io.cucumber.java.en.Given;
import main.CucumberRunner;
import pages.CuraLoginPage;

public class LoginStep extends CucumberRunner {

    CuraLoginPage curaloginpage;



    @Given("^User logged in with \"(.*)\" and \"(.*)\"$")
    public void user_login(String logicalName,String url) throws Throwable {

        System.out.println(logicalName);
        System.out.println(url);

          Method method; ITestContext iTestContext;
        try {
            curaloginpage.LogintoCura(logicalName, url); **>>> NULL POINTER EXCEPTION**
        }
        catch(Exception e){
            e.printStackTrace();
        }


    }


}

堆栈跟踪:

java.lang.NullPointerException
    at stepdefinition.LoginStep.user_login(LoginStep.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at io.cucumber.java.Invoker.invoke(Invoker.java:27)
    at io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:27)
    at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
    at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:64)
    at io.cucumber.core.runner.TestStep.run(TestStep.java:49)
    at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:46)
    at io.cucumber.core.runner.TestCase.run(TestCase.java:51)
    at io.cucumber.core.runner.Runner.runPickle(Runner.java:67)
    at io.cucumber.testng.TestNGCucumberRunner.runScenario(TestNGCucumberRunner.java:124)
    at io.cucumber.testng.AbstractTestNGCucumberTests.runScenario(AbstractTestNGCucumberTests.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:134)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:597)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.testng.TestRunner.privateRun(TestRunner.java:766)
    at org.testng.TestRunner.run(TestRunner.java:587)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:28)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:425)
    at org.testng.internal.thread.ThreadUtil.lambda$execute$0(ThreadUtil.java:68)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

请帮助,因为我是第一次尝试cucumber与TestNG。 我没有在步骤定义中使用驱动程序。 我真的不确定是什么原因导致NullPointerException发生


共1个答案

匿名用户

您似乎还没有在步骤定义中创建CuraLoginPage的实例。 如果您使用的是TestNG page对象模型,那么您需要添加如下内容。

CuraLoginPage curaloginpage;

public LoginStep()
{
    curaloginpage = new CuraLoginPage(driver);
}

如果可能的话,那么也共享CuraLoginPage的代码的代码。