I am restricted from using internet and hence cannot use Maven. I am working on TestNG by placing all the required dependency jars manually into IntelliJ. When running testng.xml file, I get the error:
rg.testng.ITestNGListener: Provider io.qameta.allure.testng.AllureTestNg could not be instantiated
Here are the dependencies for allure reports (TestNG 7.8.0, Selenium 4.9 are there).
Allure dependencies:
- allure-testng 2.23.0
- allure-model 2.23.0
- allure-attachments 2.23.0
- allure-java-commons 2.23.0
- allure-descriptions-javadoc 2.23.0
- aspectjweaver 1.9.19
- jaxb-api 2.3.1
I tried to get an answer but in vain. Please help! Note: I have allure binaries (2.23.0) set to environment variables, and the version in command prompt shows as 2.23.0
Here is my code: TestBase (My base class)
package tests;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.ITestContext;
import org.testng.annotations.Listeners;
import utils.AllureListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
public class TestBase {
public static WebDriver driver;
public static Properties prop;
public static int TIMEOUT = 60;
public static ThreadLocal<WebDriver> tdriver = new ThreadLocal<WebDriver>();
public TestBase() {
try {
prop = new Properties();
FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/src/testDAta/config.properties");
prop.load(fis);
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
public WebDriver setup() {
System.setProperty("webdriver.edge.driver", System.getProperty("user.dir") + prop.getProperty("edge.path"));
driver = new EdgeDriver();
driver.manage().window().maximize();
// context.setAttribute("driver", driver);
tdriver.set(driver);
return getDriver();
}
public void getURL(String url){
if (url.equalsIgnoreCase("google")) {
driver.get(prop.getProperty("web.urlG"));
} else if (url.equalsIgnoreCase("yahoo")) {
driver.get(prop.getProperty("web.urlY"));
} else {
System.out.println("none!");
}
}
public static synchronized WebDriver getDriver(){
return tdriver.get();
}
public void waitAndClickElement(WebElement element) {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT));
wait.until(ExpectedConditions.elementToBeClickable(element)).click();
}
public void waitForElementToAppear(WebElement element){
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT));
wait.until(ExpectedConditions.visibilityOf(element));
}
public void switchWindow(int idx){
Set<String> allHandles = driver.getWindowHandles();
List<String> handlesList = new ArrayList<>(allHandles);
System.out.println("Handles: " + handlesList);
driver.switchTo().window(handlesList.get(idx));
}
public void captureScreenshot(String screenshotName){
try{
TakesScreenshot ts = (TakesScreenshot) driver;
File srcFile = ts.getScreenshotAs(OutputType.FILE);
String destPath = System.getProperty("user.dir") + "/screenshots/" + screenshotName + ".png";
File destFile = new File(destPath);
FileUtils.copyFile(srcFile, destFile);
}catch (IOException e){
e.printStackTrace();
}
}
}
AllureListener class
package utils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import io.qameta.allure.Attachment;
import tests.TestBase;
public class AllureListener implements ITestListener {
private static String getTestMethodName(ITestResult iTestResult) {
return iTestResult.getMethod().getConstructorOrMethod().getName();
}
@Attachment
public byte[] saveFailureScreenShot(WebDriver driver) {
return ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);
}
@Attachment(value = "{0}", type = "text/plain")
public static String saveTextLog(String message) {
return message;
}
@Override
public void onStart(ITestContext iTestContext) {
System.out.println("I am in onStart method " + iTestContext.getName());
iTestContext.setAttribute("WebDriver", TestBase.getDriver());
}
@Override
public void onFinish(ITestContext iTestContext) {
System.out.println("I am in onFinish method " + iTestContext.getName());
}
@Override
public void onTestStart(ITestResult iTestResult) {
System.out.println("I am in onTestStart method " + getTestMethodName(iTestResult) + " start");
}
@Override
public void onTestSuccess(ITestResult iTestResult) {
System.out.println("I am in onTestSuccess method " + getTestMethodName(iTestResult) + " succeed");
}
@Override
public void onTestFailure(ITestResult iTestResult) {
System.out.println("I am in onTestFailure method " + getTestMethodName(iTestResult) + " failed");
Object testClass = iTestResult.getInstance();
WebDriver driver = TestBase.getDriver();
// Allure ScreenShot and SaveTestLog
if (driver instanceof WebDriver) {
System.out.println("Screenshot captured for test case:" + getTestMethodName(iTestResult));
saveFailureScreenShot(driver);
}
saveTextLog(getTestMethodName(iTestResult) + " failed and screenshot taken!");
}
@Override
public void onTestSkipped(ITestResult iTestResult) {
System.out.println("I am in onTestSkipped method " + getTestMethodName(iTestResult) + " skipped");
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {
System.out.println("Test failed but it is in defined success ratio " + getTestMethodName(iTestResult));
}
}
HomePage.java (PageObject class)
package pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import tests.TestBase;
public class HomePage extends TestBase {
public WebDriver driver;
public HomePage(WebDriver driver){
// this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(id = "getwebsitebtn")
WebElement txtLink;
@FindBy(xpath = "//*[text()='Get Started for Free']")
WebElement getFreeBtn;
public void linkTest(){
waitAndClickElement(txtLink);
switchWindow(1);
waitAndClickElement(getFreeBtn);
}
}
TestFile.java (Test class)
package tests;
import org.testng.ITestContext;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import pages.HomePage;
import utils.AllureListener;
import java.io.IOException;
@Listeners({AllureListener.class})
public class testFile extends TestBase{
@BeforeClass
public void setItUp(){
setup();
}
@Test
public void urlTest() throws IOException {
// Call the setup method to initialize the driver
// getURL("Yahoo"); // You can change this to "Google" or other URLs as needed
// extentTest = ExtentTestManager.getTest();
getURL("Yahoo");
HomePage hp = new HomePage(driver); // Initialize the HomePage object after the driver is set up
hp.linkTest();
System.out.println(System.getProperty("user.dir"));
}
}
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="E:/bkup2/frmwrk">
<classes><class name="tests.testFile">
<methods><include name="urlTest"/>
</methods>
</class>
</classes>
</test>
</suite>
Error:
java.util.ServiceConfigurationError: org.testng.ITestNGListener: Provider io.qameta.allure.testng.AllureTestNg could not be instantiated
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:813)
at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
at org.testng.TestNG.addServiceLoaderListeners(TestNG.java:1032)
at org.testng.TestNG.initializeConfiguration(TestNG.java:966)
at org.testng.TestNG.initializeEverything(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1074)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
Caused by: java.lang.NoClassDefFoundError: io/qameta/allure/testfilter/FileTestPlanSupplier
at io.qameta.allure.testng.AllureTestNgTestFilter.<init>(AllureTestNgTestFilter.java:40)
at io.qameta.allure.testng.AllureTestNg.<init>(AllureTestNg.java:164)
at io.qameta.allure.testng.AllureTestNg.<init>(AllureTestNg.java:168)
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484)
at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
... 8 more
Caused by: java.lang.ClassNotFoundException: io.qameta.allure.testfilter.FileTestPlanSupplier
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 15 more
Process finished with exit code -1