

„com.aventstack.extentreports.ExtentTest.info(String)' kann nicht aufgerufen werden, da „extentlisteners.ExtentListeners.test' leer ist
在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 方法中的测试初始化行上设置断点,并在调试模式下执行测试以检查为其设置的值。
Das obige ist der detaillierte Inhalt von„com.aventstack.extentreports.ExtentTest.info(String)' kann nicht aufgerufen werden, da „extentlisteners.ExtentListeners.test' leer ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Verwenden Sie Python und WebDriver, um Screenshots von Webseiten zu erstellen und diese als PDF-Dateien zu speichern. Zusammenfassung: Während der Webentwicklung und beim Testen ist es häufig erforderlich, Screenshots von Webseiten zur Analyse, Aufzeichnung und Berichterstellung zu erstellen. In diesem Artikel erfahren Sie, wie Sie mit Python und WebDriver Screenshots von Webseiten erstellen und die Screenshots zur einfachen Weitergabe und Archivierung als PDF-Dateien speichern. 1. Installieren und konfigurieren Sie SeleniumWebDriver: Installieren Sie Python: Besuchen Sie die offizielle Python-Website (https:

Python- und WebDriver-Erweiterung: Mausradoperationen auf Webseiten simulieren Einführung: Mit der kontinuierlichen Weiterentwicklung des Webinteraktionsdesigns ist die Simulation von Benutzeroperationen beim automatisierten Testen immer wichtiger geworden. Auf einigen Webseiten ist die Verwendung des Mausrads zu einer der üblichen Operationen geworden. Für Entwickler, die Python zum Schreiben automatisierter Testskripte verwenden, kann die Simulation von Mausradvorgängen in WebDriver jedoch zu einer Herausforderung werden. In diesem Artikel wird eine Methode vorgestellt, die Python und WebDrive verwendet

Verwenden von Python und WebDriver zum automatischen Aktualisieren von Webseiten Einführung: Beim täglichen Surfen im Internet stoßen wir häufig auf Szenarien, die häufige Aktualisierungen von Webseiten erfordern, z. B. die Überwachung von Echtzeitdaten, die automatische Aktualisierung dynamischer Seiten usw. Das manuelle Aktualisieren der Webseite verschwendet viel Zeit und Energie. Daher können wir Python und WebDriver verwenden, um die Funktion zum automatischen Aktualisieren der Webseite zu implementieren und unsere Arbeitseffizienz zu verbessern. 1. Installations- und Konfigurationsumgebung Bevor wir beginnen, müssen wir die entsprechende Umgebung installieren und konfigurieren. Installieren Sie Python

Verwenden Sie Python und WebDriver, um Verifizierungscodes auf Webseiten automatisch einzugeben. Mit der Entwicklung des Internets haben immer mehr Websites Verifizierungscodemechanismen bei der Benutzerregistrierung, Anmeldung und anderen Vorgängen eingeführt, um die Sicherheit zu verbessern und automatisierte Angriffe zu verhindern. Allerdings ist die manuelle Eingabe des Verifizierungscodes nicht nur mühsam, sondern erhöht auch die Komplexität des Benutzererlebnisses. Gibt es also eine Möglichkeit, den Bestätigungscode automatisch einzugeben? Die Antwort ist ja. In diesem Artikel wird erläutert, wie Sie mithilfe von Python und WebDriver automatisch Bestätigungscodes auf Webseiten eingeben. Zunächst einmal: Ich

Die Verwendung von Python und WebDriver zum automatischen Ausfüllen von Formulardaten auf Webseiten ist ein wichtiger Teil des Softwareentwicklungsprozesses. Einer davon ist das automatische Ausfüllen von Webformularen. Für Entwickler ist das manuelle Ausfüllen von Formularen ein mühsamer und fehleranfälliger Prozess. Die Verwendung von Python und WebDriver zum automatischen Ausfüllen von Tabellendaten während des automatischen Testprozesses kann manuelle Doppelarbeit reduzieren und die Testeffizienz verbessern. In diesem Artikel werde ich die Verwendung von Selenium mit Python vorstellen

Python- und WebDriver-Erweiterungen: Rechtsklick-Mausklicks auf Webseiten simulieren Wenn wir Python und WebDriver für automatisierte Webseitentests verwenden, müssen wir häufig das Mausverhalten von Benutzern simulieren, wie z. B. Klicken, Ziehen und Rechtsklick-Menüvorgänge. WebDriver bietet einige grundlegende Mausaktionsfunktionen wie Klicken, Ziehen und Ablegen usw., bietet jedoch nicht direkt eine Funktion, die einen rechten Mausklick simuliert. In diesem Artikel wird die Verwendung von Python und WebD vorgestellt

Verwenden Sie Python- und WebDriver-Erweiterungen, um den Drag-and-Drop-Vorgang von Webseiten zu automatisieren. In tatsächlichen Webanwendungen ist Drag-and-Drop (Drag-and-Drop) ein gängiger interaktiver Vorgang, der die Benutzererfahrung und den Komfort verbessern kann. Die Automatisierung von Drag-and-Drop-Vorgängen für Webseiten ist eine wichtige und häufige Aufgabe für Tester. In diesem Artikel wird erläutert, wie Sie mit Python- und WebDriver-Erweiterungen Drag-and-Drop-Vorgänge auf Webseiten automatisieren. 1. Vorbereitung Bevor wir beginnen, müssen wir Pyt installieren

Verwenden von Python und WebDriver zum automatischen Ausfüllen von Dropdown-Feldern für Provinzen und Städte auf Webseiten Einführung: In Webformularen stoßen Sie häufig auf Dropdown-Felder für die Auswahl von Provinzen und Städten, und zwischen diesen Dropdown-Feldern bestehen bestimmte Abhängigkeiten. Das manuelle Ausfüllen dieser Dropdown-Felder ist eine mühsame und zeitaufwändige Aufgabe, aber durch die Verwendung von Python und WebDriver können wir diese Dropdown-Felder automatisch ausfüllen und die Arbeitseffizienz verbessern. In diesem Artikel wird erläutert, wie Sie mithilfe von Python und WebDriver die Dropdown-Felder für Provinzen und Städte auf Webseiten automatisch ausfüllen.