在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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号