

Unable to call 'com.aventstack.extentreports.ExtentTest.info(String)' because 'extentlisteners.ExtentListeners.test' is empty
在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 方法中的测试初始化行上设置断点,并在调试模式下执行测试以检查为其设置的值。
The above is the detailed content of Unable to call 'com.aventstack.extentreports.ExtentTest.info(String)' because 'extentlisteners.ExtentListeners.test' is empty. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Python and WebDriver extension: Simulating mouse wheel operations in web pages Introduction: With the continuous development of web interaction design, simulating user operations has become more and more important in automated testing. On some web pages, the use of the mouse wheel has become one of the common operations. However, for developers who use Python to write automated test scripts, how to simulate mouse wheel operations in WebDriver can become a challenge. This article will introduce a method using Python and WebDriv

Use Python and WebDriver to screenshot web pages and save them as PDF files Summary: During web development and testing, it is often necessary to screenshot web pages for analysis, recording, and reporting. This article will introduce how to use Python and WebDriver to take screenshots of web pages and save the screenshots as PDF files for easy sharing and archiving. 1. Install and configure SeleniumWebDriver: Install Python: Visit the Python official website (https:

Use Python and WebDriver to automatically fill in verification codes on web pages. With the development of the Internet, more and more websites have introduced verification code mechanisms in user registration, login and other operations to improve security and prevent automated attacks. However, manually entering the verification code is not only troublesome, but also increases the complexity of the user experience. So, is there a way to automatically fill in the verification code? The answer is yes. This article will introduce how to use Python and WebDriver to automatically fill in verification codes on web pages. firstly, I

Using Python and WebDriver to implement automatic web page refresh Introduction: In daily web browsing, we often encounter scenarios that require frequent web page refreshes, such as monitoring real-time data, automatically refreshing dynamic pages, etc. Manually refreshing the web page will waste a lot of time and energy, so we can use Python and WebDriver to implement the function of automatically refreshing the web page and improve our work efficiency. 1. Installation and configuration environment Before starting, we need to install and configure the corresponding environment. Install Python

Python and WebDriver extensions: Simulate right-click mouse clicks on web pages When using Python and WebDriver for automated web page testing, we often need to simulate user mouse behaviors, such as clicks, drags, and right-click menu operations. WebDriver will provide some basic mouse action functions, such as click, drag_and_drop, etc., but it does not directly provide a function to simulate a right mouse click. This article will introduce how to use Python and WebD

Using Python and WebDriver to automatically fill in form data on web pages is an important part of the software development process. One of them is the automatic filling of web forms. For developers, filling out forms manually is a tedious and error-prone process. Using Python and WebDriver to automatically fill in table data during the automatic testing process can reduce manual duplication of work and improve testing efficiency. In this article, I will introduce how to use Selenium with Python

Use Python and WebDriver extensions to automate the drag-and-drop operation of web pages. In actual web applications, drag-and-drop (Drag and Drop) is a common interactive operation, which can enhance user experience and convenience. Automating drag-and-drop operations for web pages is an important and common task for testers. This article will introduce how to use Python and WebDriver extensions to automate drag-and-drop operations on web pages. 1. Preparation Before starting, we need to install Pyt

Using Python and WebDriver to implement form automatic filling function In daily website browsing, we often encounter situations where we need to fill in forms. When we need to fill out the same or similar forms frequently, manual filling becomes tedious and time-consuming. Fortunately, we can use Python and WebDriver to realize the function of automatically filling in forms and improve our work efficiency. First, we need to install the selenium library. Selenium is an automated testing tool that can simulate