在PHP开发中,我们经常会遇到各种问题和错误提示。其中一个常见的问题是“无法调用‘com.aventstack.extentreports.ExtentTest.info(String)’,因为‘extentlisteners.ExtentListeners.test’为空”。这个错误提示可能让人感到困惑,不知道如何解决。在本文中,php小编百草将为大家解析这个问题的原因,并提供解决方法,帮助大家顺利解决这个错误。
我正在学习 selenium,主题是范围报告。现在,当我在框架中实现以前的代码时,我收到此错误。这段代码在重新启动 ide 后可以工作,但现在不再工作了。 这是我的代码。
基础测试文件:
package base; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioexception; import java.sql.sqlexception; import java.time.duration; import java.util.properties; import org.apache.log4j.propertyconfigurator; import org.openqa.selenium.by; import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.firefox.firefoxdriver; import org.openqa.selenium.support.ui.webdriverwait; import org.testng.annotations.aftersuite; import org.testng.annotations.beforesuite; import org.testng.log4testng.logger; import extentlisteners.extentlisteners; import utilities.dbmanager; import utilities.excelreader; import utilities.monitoringmail; public class basetest { public static webdriver driver; public static properties or = new properties(); public static properties config = new properties(); public static fileinputstream fis; public static excelreader excel = new excelreader("./src/test/resources/excel/testdata.xlsx"); public static logger log = logger.getlogger(basetest.class); public static monitoringmail mail = new monitoringmail(); public static webdriverwait wait; //findele finds the element based on the select type and enters the value : id/xpath/css public void type(string key, string value) { if(key.endswith("id")) { driver.findelement(by.id(or.getproperty(key))).sendkeys(value);; }else if(key.endswith("xpath")) { driver.findelement(by.xpath(or.getproperty(key))).sendkeys(value); }else if(key.endswith("css")) { driver.findelement(by.cssselector(or.getproperty(key))).sendkeys(value); } log.info("typing in an element : " + key + " , entered the values as : " + value); extentlisteners.test.info("typing in an element : " + key + " , entered the values as : " + value); //getting error on this line } //clickele clicks on the element based on the select type : id/xpath/css public void click(string key) { if(key.endswith("id")) { driver.findelement(by.xpath(or.getproperty(key))).click(); }else if(key.endswith("xpath")) { driver.findelement(by.xpath(or.getproperty(key))).click(); }else if(key.endswith("css")) { driver.findelement(by.xpath(or.getproperty(key))).click(); } log.info("clicking on element : " + key); extentlisteners.test.info("clicking on element : " + key); } @beforesuite public void setup() { if(driver == null) { propertyconfigurator.configure("./src/test/resources/properties/log4j.properties"); //configuring log4j log.info("test execution started"); try { fis = new fileinputstream("./src/test/resources/properties/config.properties"); //loading config file into fis } catch (filenotfoundexception e) { e.printstacktrace(); } try { config.load(fis); //loading fis to config properties log.info("config.properties file loaded"); } catch (ioexception e) { e.printstacktrace(); } try { fis = new fileinputstream("./src/test/resources/properties/or.properties"); //loading or file into fis } catch (filenotfoundexception e) { e.printstacktrace(); } try { or.load(fis); //loading fis to or properties log.info("config.properties file loaded"); } catch (ioexception e) { e.printstacktrace(); } //launching browser by checking which browser to launch from config file if(config.getproperty("browser").equals("chrome")){ driver = new chromedriver(); log.info("chrome browser launched"); } else if(config.getproperty("browser").equals("firefox")){ driver = new firefoxdriver(); log.info("firefox browser launched"); } //navigating to url provided in config file driver.get(config.getproperty("testsiteurl")); log.info("navigating to test site : " + config.getproperty("testsiteurl")); //maximizing browser window driver.manage().window().maximize(); //applying implicit wait driver.manage().timeouts().implicitlywait(duration.ofseconds(integer.parseint(config.getproperty("implicit.wait")))); //applying explicit wait wait = new webdriverwait(driver, duration.ofseconds(integer.parseint(config.getproperty("explicit.wait")))); //jdbc connection try { dbmanager.setmysqldbconnection(); log.info("database connection established"); } catch (classnotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } @aftersuite public void teardown() { driver.quit(); log.info("test execution completed"); } }
登录测试文件:
package testcases; import org.testng.annotations.dataprovider; import org.testng.annotations.test; import base.basetest; public class logintest extends basetest { @test(dataprovider = "data") public void dologin(string username, string password) { type("username_id",username); type("password_id",password); click("loginbtn_xpath"); } @dataprovider(name="data") public object[][] getdata() { string sheetname = "logintest"; int rownum = excel.getrowcount(sheetname); int colnum = excel.getcolumncount(sheetname); excel.getcelldata(sheetname, colnum, rownum); object[][] data = new object[rownum-1][colnum]; int row,col; for(row=2;row<=rownum;row++){ for(col=0;col<colnum;col++){ data[row-2][col]=excel.getcelldata(sheetname, col, row); } } return data; } }
范围监听器:
package extentlisteners; import java.util.date; import org.testng.isuite; import org.testng.isuitelistener; import org.testng.itestcontext; import org.testng.itestlistener; import org.testng.itestresult; import com.aventstack.extentreports.extentreports; import com.aventstack.extentreports.extenttest; import com.aventstack.extentreports.status; import com.aventstack.extentreports.markuputils.extentcolor; import com.aventstack.extentreports.markuputils.markup; import com.aventstack.extentreports.markuputils.markuphelper; public class extentlisteners implements itestlistener, isuitelistener { static date d = new date(); static string filename = "extent_" + d.tostring().replace(":", "_").replace(" ", "_") + ".html"; private static extentreports extent = extentmanager .createinstance(".\\reports\\" + filename); public static extenttest test; public void onteststart(itestresult result) { test = extent .createtest(result.gettestclass().getname() + " @testcase : " + result.getmethod().getmethodname()); } public void ontestsuccess(itestresult result) { string methodname = result.getmethod().getmethodname(); string logtext = "<b>" + "test case:- " + methodname.touppercase() + " passed" + "</b>"; markup m = markuphelper.createlabel(logtext, extentcolor.green); test.pass(m); } public void ontestfailure(itestresult result) { ///test.fail(result.getthrowable().getmessage()); /*try { extentmanager.capturescreenshot(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); }*/ string methodname=result.getmethod().getmethodname(); string logtext="<b>"+"test case:- "+ methodname.touppercase()+ " failed"+"</b>"; //test.fail("<b><font color=red>" + "screenshot of failure" + "</font></b><br>",mediaentitybuilder.createscreencapturefrompath(extentmanager.filename) // .build()); markup m = markuphelper.createlabel(logtext, extentcolor.red); test.log(status.fail, m); } public void ontestskipped(itestresult result) { string methodname = result.getmethod().getmethodname(); string logtext = "<b>" + "test case:- " + methodname + " skipped" + "</b>"; markup m = markuphelper.createlabel(logtext, extentcolor.amber); test.skip(m); } public void ontestfailedbutwithinsuccesspercentage(itestresult result) { // todo auto-generated method stub } public void onstart(itestcontext context) { } public void onfinish(itestcontext context) { if (extent != null) { extent.flush(); } } public void onstart(isuite suite) { // todo auto-generated method stub } public void onfinish(isuite suite) { // todo auto-generated method stub } }
我尝试注释 extentlistener
行,它工作正常,因此提取数据或将数据插入到元素中没有问题。这段代码工作过一次,所以我很困惑为什么它不工作并抛出这个错误。
错误消息:
FAILED: testCases.LoginTest.doLogin("[email protected]", "kjsdfnvjndklsv") java.lang.NullPointerException: Cannot invoke "com.aventstack.extentreports.ExtentTest.info(String)" because "extentlisteners.ExtentListeners.test" is null at base.BaseTest.type(BaseTest.java:64) at testCases.LoginTest.doLogin(LoginTest.java:13) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.testng.TestRunner.privateRun(TestRunner.java:848) at org.testng.TestRunner.run(TestRunner.java:621) at org.testng.SuiteRunner.runTest(SuiteRunner.java:443) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397) at org.testng.SuiteRunner.run(SuiteRunner.java:336) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280) at org.testng.TestNG.runSuitesLocally(TestNG.java:1200) at org.testng.TestNG.runSuites(TestNG.java:1114) at org.testng.TestNG.run(TestNG.java:1082) 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)
看来你的代码没有任何问题。
“extentlisteners.test”为 null 的原因可能仅与 onteststart 在测试之前没有运行有关。
确保您的侦听器已添加到 testng xml 中:
<!doctype suite system "http://testng.org/testng-1.0.dtd"> <suite name="mytestsuite"> <listeners> <listener class-name="extentlisteners.extentlisteners"/> </listeners> <test name="mytest"> <packages> <package name="testcases"/> </packages> </test> </suite>
或者,如果您以编程方式创建套件,请不要忘记在其中添加侦听器:
TestNG testng = new TestNG(); testng.setTestClasses(new Class[] { LoginTest.class }); testng.addListener(new ExtentListener()); testng.run();
此外,您可以在 onteststart 方法中的测试初始化行上设置断点,并在调试模式下执行测试以检查为其设置的值。
以上是无法调用“com.aventstack.extentreports.ExtentTest.info(String)”,因为“extentlisteners.ExtentListeners.test”为空的详细内容。更多信息请关注PHP中文网其他相关文章!