목차
问题内容
解决方法
Java 'extentlisteners.ExtentListeners.test'가 비어 있기 때문에 'com.aventstack.extentreports.ExtentTest.info(String)'을 호출할 수 없습니다.

'extentlisteners.ExtentListeners.test'가 비어 있기 때문에 'com.aventstack.extentreports.ExtentTest.info(String)'을 호출할 수 없습니다.

Feb 11, 2024 pm 04:39 PM
webdriver

在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&#160;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 方法中的测试初始化​​行上设置断点,并在调试模式下执行测试以检查为其设置的值。

위 내용은 'extentlisteners.ExtentListeners.test'가 비어 있기 때문에 'com.aventstack.extentreports.ExtentTest.info(String)'을 호출할 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python 및 WebDriver 확장: 웹 페이지에서 마우스 휠 작업 시뮬레이션 Python 및 WebDriver 확장: 웹 페이지에서 마우스 휠 작업 시뮬레이션 Jul 09, 2023 pm 11:55 PM

Python 및 WebDriver 확장: 웹 페이지에서 마우스 휠 작업 시뮬레이션 소개: 웹 상호 작용 디자인의 지속적인 개발로 인해 자동화된 테스트에서 사용자 작업 시뮬레이션이 점점 더 중요해졌습니다. 일부 웹페이지에서는 마우스 휠을 사용하는 것이 일반적인 작업 중 하나가 되었습니다. 그러나 Python을 사용하여 자동화된 테스트 스크립트를 작성하는 개발자의 경우 WebDriver에서 마우스 휠 작업을 시뮬레이션하는 방법이 어려울 수 있습니다. 이번 글에서는 Python과 WebDriv를 이용한 방법을 소개하겠습니다.

Python 및 WebDriver를 사용하여 웹 페이지를 캡처하고 PDF 파일로 저장 Python 및 WebDriver를 사용하여 웹 페이지를 캡처하고 PDF 파일로 저장 Jul 08, 2023 pm 10:55 PM

Python 및 WebDriver를 사용하여 웹 페이지 스크린샷을 캡처하고 PDF 파일로 저장 요약: 웹 개발 및 테스트 중에 분석, 기록 및 보고를 위해 웹 페이지 스크린샷을 캡처해야 하는 경우가 많습니다. 이 기사에서는 Python 및 WebDriver를 사용하여 웹 페이지의 스크린샷을 찍고 스크린샷을 PDF 파일로 저장하여 쉽게 공유하고 보관하는 방법을 소개합니다. 1. SeleniumWebDriver 설치 및 구성: Python 설치: Python 공식 웹사이트(https:

Python 및 WebDriver를 사용하여 웹 페이지의 인증 코드를 자동으로 입력하세요. Python 및 WebDriver를 사용하여 웹 페이지의 인증 코드를 자동으로 입력하세요. Jul 07, 2023 am 10:19 AM

Python 및 WebDriver를 사용하여 웹 페이지에 자동으로 인증 코드를 입력하세요. 인터넷이 발전하면서 점점 더 많은 웹사이트에서 보안을 강화하고 자동화된 공격을 방지하기 위해 사용자 등록, 로그인 및 기타 작업에 인증 코드 메커니즘을 도입했습니다. 그러나 인증 코드를 수동으로 입력하는 것은 번거로울 뿐만 아니라 사용자 경험의 복잡성을 증가시킵니다. 그렇다면 인증번호를 자동으로 입력할 수 있는 방법은 없을까요? 대답은 '예'입니다. 이 글에서는 Python과 WebDriver를 사용하여 웹 페이지에 인증 코드를 자동으로 입력하는 방법을 소개합니다. 첫째로, 나는

Python 및 WebDriver를 사용하여 웹 페이지 자동 새로 고침 Python 및 WebDriver를 사용하여 웹 페이지 자동 새로 고침 Jul 08, 2023 pm 01:46 PM

Python 및 WebDriver를 사용하여 자동 웹 페이지 새로 고침 구현 소개: 일상적인 웹 탐색에서 실시간 데이터 모니터링, 동적 페이지 자동 새로 고침 등과 같이 빈번한 웹 페이지 새로 고침이 필요한 시나리오를 자주 접하게 됩니다. 웹 페이지를 수동으로 새로 고치는 것은 많은 시간과 에너지를 낭비하므로 Python과 WebDriver를 사용하여 웹 페이지를 자동으로 새로 고치는 기능을 구현하고 작업 효율성을 향상시킬 수 있습니다. 1. 설치 및 환경 구성 시작하기 전에 해당 환경을 설치하고 구성해야 합니다. 파이썬 설치

Python 및 WebDriver를 사용하여 웹 페이지의 테이블 데이터 자동 채우기 Python 및 WebDriver를 사용하여 웹 페이지의 테이블 데이터 자동 채우기 Jul 07, 2023 pm 08:37 PM

Python 및 WebDriver를 사용하여 웹 페이지의 양식 데이터를 자동으로 채우는 것은 소프트웨어 개발 프로세스의 중요한 부분 중 하나는 웹 양식의 자동 채우기입니다. 개발자에게 양식을 수동으로 작성하는 것은 지루하고 오류가 발생하기 쉬운 프로세스입니다. 자동 테스트 프로세스 중에 Python 및 WebDriver를 사용하여 테이블 데이터를 자동으로 채우면 수동 작업 중복을 줄이고 테스트 효율성을 높일 수 있습니다. 이번 글에서는 Python에서 Selenium을 사용하는 방법을 소개하겠습니다.

Python 및 WebDriver 확장: 웹 페이지에서 마우스 오른쪽 버튼 클릭 시뮬레이션 Python 및 WebDriver 확장: 웹 페이지에서 마우스 오른쪽 버튼 클릭 시뮬레이션 Jul 07, 2023 am 11:22 AM

Python 및 WebDriver 확장: 웹 페이지에서 마우스 오른쪽 버튼 클릭 시뮬레이션 자동화된 웹 페이지 테스트를 위해 Python 및 WebDriver를 사용할 때 클릭, 드래그 및 마우스 오른쪽 버튼 클릭 메뉴 작업과 같은 사용자 마우스 동작을 시뮬레이션해야 하는 경우가 많습니다. WebDriver는 클릭, 드래그 앤 드롭 등과 같은 몇 가지 기본적인 마우스 동작 기능을 제공하지만 마우스 오른쪽 버튼 클릭을 시뮬레이션하는 기능을 직접 제공하지는 않습니다. 이 기사에서는 Python과 WebD를 사용하는 방법을 소개합니다.

Python 및 WebDriver 확장을 사용하여 웹 페이지에서 끌어서 놓기 작업 자동화 Python 및 WebDriver 확장을 사용하여 웹 페이지에서 끌어서 놓기 작업 자동화 Jul 10, 2023 pm 07:09 PM

Python 및 WebDriver 확장을 사용하여 웹 페이지의 드래그 앤 드롭 작업을 자동화합니다. 실제 웹 애플리케이션에서 드래그 앤 드롭(Drag and Drop)은 사용자 경험과 편의성을 향상시킬 수 있는 일반적인 대화형 작업입니다. 웹 페이지의 끌어서 놓기 작업을 자동화하는 것은 테스터에게 중요하고 일반적인 작업입니다. 이 기사에서는 Python 및 WebDriver 확장을 사용하여 웹 페이지에서 끌어서 놓기 작업을 자동화하는 방법을 소개합니다. 1. 준비 시작하기 전에 Pyt를 설치해야 합니다.

Python 및 WebDriver를 사용하여 양식 자동 채우기 기능 구현 Python 및 WebDriver를 사용하여 양식 자동 채우기 기능 구현 Jul 07, 2023 am 10:25 AM

Python 및 WebDriver를 사용하여 양식 자동 채우기 기능 구현 일상적인 웹 사이트 탐색에서 양식을 작성해야 하는 상황에 자주 직면합니다. 동일하거나 유사한 양식을 자주 작성해야 하는 경우 수동으로 작성하는 것은 지루하고 시간이 많이 걸립니다. 다행히 Python과 WebDriver를 사용하면 자동으로 양식을 채우는 기능을 실현하고 작업 효율성을 높일 수 있습니다. 먼저 Selenium 라이브러리를 설치해야 합니다. Selenium은 시뮬레이션할 수 있는 자동화된 테스트 도구입니다.