有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVAlang.NullPointerException:org。openqa。硒。OutputType),因为“屏幕截图”为空

我有一个maven项目,运行testng和cucumber。如果我运行testng而我的测试失败,我的程序会截图并创建报告。然而,如果我运行cumber测试失败,我会得到java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.TakesScreenshot.getScreenshotAs(org.openqa.selenium.OutputType)" because "screenShot" is null

testng和cucumber都引用相同的侦听器和基类

我的听众课堂(关于失败):

    @Override
    public void onTestFailure(ITestResult result) {     
        ExtentThred.get().fail(result.getThrowable());
        
        WebDriver driver = null;
        String testMethodName = result.getMethod().getMethodName();
        
        try {
            driver = (WebDriver)result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance());
        } 
        catch (Exception e)
        {
            
        }
        
        try {
            ExtentThred.get().addScreenCaptureFromPath(getScreenshotPath(testMethodName, driver),result.getMethod().getMethodName());
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

我的基类:

public class Base {

    public static WebDriver driver;
    public Properties prop;
    
    public WebDriver initializeDriver() throws IOException {
        
        prop = new Properties();
        FileInputStream file = new FileInputStream(System.getProperty("user.dir") + "\\src\\main\\java\\resources\\data.properties");
        prop.load(file);
        String browserName = prop.getProperty("browser");
        
        if (browserName.contains("chrome")) {
            System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "\\chromedriver.exe");
            
            ChromeOptions chromeOptions = new ChromeOptions();
            
            if (browserName.contains("headless")){
                chromeOptions.addArguments("headless");
            }
            driver = new ChromeDriver(chromeOptions);
        }
        else if (browserName == "firefox") {
            
        }
        else if (browserName == "edge") {
            
        }
        
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        return driver;
    }
    
    public String getScreenshotPath(String testCaseName, WebDriver driver) throws IOException
    {
        TakesScreenshot screenShot = (TakesScreenshot) driver;
        File source = screenShot.getScreenshotAs(OutputType.FILE);
        String destinationFile = System.getProperty("user.dir")+"\\reports\\"+ testCaseName +".png";
        FileUtils.copyFile(source, new File(destinationFile));
        return destinationFile;
    }
}

我的testng类运行良好:

public class ValidateLoggedIn extends Base {
    
    public WebDriver driver;
    
    @BeforeTest
    public void initialize() throws IOException {
        driver = initializeDriver();
    }
    
    @Test(dataProvider = "getData")
    public void HomePageTitle(String mobileNumber, String password, String access) throws IOException {
        
        driver.get(prop.getProperty("cars"));
        
        MainPage mainPage = new MainPage(driver);
        
        mainPage.getLogin().click();
        mainPage.getMobileNumber().sendKeys(mobileNumber);
        mainPage.getPassword().sendKeys(password);
        mainPage.getLoginButton().click();
        
        if (access == "Allowed User") {
            LoggedInPage loggedInPage = new LoggedInPage(driver);
            Assert.assertTrue(loggedInPage.getLogOutButton().isDisplayed());
            loggedInPage.getLogOutButton().click();
        }
        
        else {
            mainPage.getLoginButton();
            Assert.assertTrue(mainPage.getLoginButton().isDisplayed());
        }
    }
        
    
    @DataProvider   
    public Object[][] getData() {
        Object[][] userData = new Object[1][3];
        userData[0][0] = "0720127992";
        userData[0][1] = "Dr0medar!s";
        userData[0][2] = "Allowed User";
        
        return userData;    
    }
    
    @AfterTest
    public void teardown()
    {
        driver.close();
    }
    
}

我的黄瓜步骤定义:

public class StepDefinition extends Base {
    
    public WebDriver driver;

    @Given("^Initilize the browser with Chrome$")
    public void initilize_the_browser_with_chrome() throws Throwable {
        driver = initializeDriver();
    }

    @When("^User enters (.+) and (.+) and logs in$")
    public void user_enters_and_and_logs_in(String mobilenumber, String password) throws Throwable {
        MainPage mainPage = new MainPage(driver);
        
        mainPage.getLogin().click();
        mainPage.getMobileNumber().sendKeys(mobilenumber);
        mainPage.getPassword().sendKeys(password);
        mainPage.getLoginButton().click();
    }

    @Then("^verify if user is successfully logged in$")
    public void verify_if_user_is_successfully_logged_in() throws Throwable {
        LoggedInPage loggedInPage = new LoggedInPage(driver);
        Assert.assertTrue(loggedInPage.getLogOutButton().isDisplayed());
        loggedInPage.getLogOutButton().click();
    }

    @And("^Navigate to \"([^\"]*)\" site$")
    public void navigate_to_something_site(String strArg1) throws Throwable {
        driver.get(strArg1);
    }
    
    @And("^Close Browser$")
    public void close_browser() throws Throwable {
        driver.quit();
    }
    
}

我的试跑者:

@CucumberOptions(
        features = "src/test/java/features",
        glue = "stepDefinitions")
public class TestRunner extends AbstractTestNGCucumberTests {

}

我的错误:

java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.TakesScreenshot.getScreenshotAs(org.openqa.selenium.OutputType)" because "screenShot" is null
    at resources.Base.getScreenshotPath(Base.java:53)
    at cars.Listeners.onTestFailure(Listeners.java:52)
    at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:96)
    at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:220)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:832)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.base/java.util.ArrayList.forEach(Unknown Source)
    at org.testng.TestRunner.privateRun(TestRunner.java:764)
    at org.testng.TestRunner.run(TestRunner.java:585)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
    at org.testng.SuiteRunner.run(SuiteRunner.java:286)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
    at org.testng.TestNG.runSuites(TestNG.java:1069)
    at org.testng.TestNG.run(TestNG.java:1037)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

我不知道为什么Cumber会给出一个NullPointerException而testng不会。使用'e.printStackTrace()'我看到驱动程序为空

我看过null-pointer-exception-when-trying-to-take-a-screenshot-with-seleniumexception-while-taking-screenshot等答案,但没有任何帮助


共 (3) 个答案

  1. # 1 楼答案

    它有一个关闭浏览器的步骤,然后您试图在listener类中访问此会话,显然,该会话将为空

    请在测试后删除并重试

  2. # 2 楼答案

    getDeclaredField替换为getField

    driver = (WebDriver)result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance());
    

    getField可以从超类继承字段,但getDeclaredField不能getDeclaredField将自身限制为调用函数的类

    并从基类的public static WebDriver Driver中删除static

  3. # 3 楼答案

    我认为问题可能在于您的基本文件,其中您有:

    “公共静态WebDriver驱动程序;”

    移除“静电”,它应该能正常工作