selenium - 在 TestNG XML 文件中实现范围报告时出现 java.lang.ClassCastException 错误
问题描述
我收到一条错误消息,告诉 java.lang.ClassCastException:当将 TestNG XML 文件作为测试套件运行时,[My extent report class name] cannot be cast to org.testng.ITestNGListener。
我已经使用 MAVEN 和 TestNG 的页面工厂设计技术自动化了一个网页,其中包含在一个包中初始化的 6 个页面类对象。我还在另一个包中编写了范围报告侦听器类。除此之外,我在另一个包中还有一个基类,它是所有 6 个页面对象初始化类的超类。我已经为 3 个页面类编写了测试用例,基类也是这些类的超类。
我通过添加所有 3 页测试用例并添加范围报告类作为此 XML 文件的侦听器来生成 TestNG XML 文件。
我将通过从下面的每个包中包含一个类来展示我的框架的结构。
页面对象初始化包-登录类
package com.crm.qa.pages;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import com.crm.qa.base.TestBase;
import com.crm.qa.util.TestUtil;
public class LoginPage extends TestBase {
@FindBy(name="username")
WebElement userName;
@FindBy(name="password")
WebElement password;
@FindBy(xpath="//input[@type='submit']")
WebElement loginBtn;
@FindBy(xpath="//button[contains(text(),'Sign Up')]")
WebElement signupBtn;
@FindBy(xpath="//img[@class = 'img-responsive']")
WebElement crmLogo;
//Initializing the page objects
public LoginPage() {
PageFactory.initElements(driver, this);
}
public String validateLoginPageTitle() {
return driver.getTitle();
}
public boolean validateCRMLogo() {
return crmLogo.isDisplayed();
}
public HomePage login (String un, String pwd) {
userName.sendKeys(un);
password.sendKeys(pwd);
loginBtn.submit();
driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);
// Actions act = new Actions(driver);
// act.moveToElement(loginBtn).click().build().perform();
return new HomePage();
}
}
基础包 - 测试基类
package com.crm.qa.base;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import com.crm.qa.util.TestUtil;
import com.crm.qa.util.WebEventListener;
public class TestBase {
public static WebDriver driver;
public static Properties prop;
public static EventFiringWebDriver e_driver;
public static WebEventListener eventListener;
public TestBase() {
try {
prop = new Properties();
FileInputStream ip = new FileInputStream("C:\\Users\\i7\\git\\TestDesignFramework1\\Suresh.com.automationLearning\\src"
+ "\\main\\java\\com\\crm\\qa\\config\\config.properties");
prop.load(ip);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public static void initialization () {
String browserName = prop.getProperty("browser");
if(browserName.equals("chrome")) {
System.setProperty("webdriver.chrome.driver", "E:\\C\\Selenium\\Chrome Driver\\Extract\\chromedriver.exe");
driver = new ChromeDriver();
}
else if (browserName.equals("firefox")) {
System.setProperty("webdriver.gecko.driver", "E:\\C\\Selenium\\GeckoDriver\\Extract\\geckodriver.exe");
driver = new FirefoxDriver();
}
e_driver = new EventFiringWebDriver(driver);
eventListener = new WebEventListener();
e_driver.register(eventListener);
driver = e_driver;
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.get(prop.getProperty("url"));
driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(TestUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);
}
}
测试用例包——登录页面测试类
package com.crm.qa.pages.testcases;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.Assert;
import com.crm.qa.base.TestBase;
import com.crm.qa.pages.HomePage;
import com.crm.qa.pages.LoginPage;
public class LoginPageTest extends TestBase {
LoginPage loginPage;
HomePage homepage;
public LoginPageTest() {
super();
}
@BeforeMethod
public void setUp() {
initialization();
loginPage = new LoginPage();
}
@Test(priority = 1)
public void loginPageTitle() {
// extentTest = extent.createTest("loginPageTitle");
String title = loginPage.validateLoginPageTitle();
Assert.assertEquals(title, "#1 Free CRM software in the "
+ "cloud for sales and service");
}
@Test(priority = 2)
public void crmLogoImageTest() {
// extentTest = extent.createTest("crmLogoImageTest");
boolean flag = loginPage.validateCRMLogo();
Assert.assertTrue(flag);
}
@Test(priority = 3)
public void loginTest() {
// extentTest = extent.createTest("loginTest");
homepage = loginPage.login(prop.getProperty("username"), prop.getProperty("password"));
System.out.println("Successfully login to the home page of freeCRM");
}
@AfterMethod
public void tearDown() {
driver.quit();
}
}
Test Util 包 - 范围报告侦听器类
package com.crm.qa.ExtentReport;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
public class ExtentReportListener {
public static ExtentHtmlReporter htmlReporter;
public static ExtentReports extent;
public static ExtentTest extentTest;
@BeforeSuite
public void setUp() {
htmlReporter = new ExtentHtmlReporter("C:\\Users\\i7\\git\\TestDesignFramework1\\Suresh.com.automationLearning\\Reporting\\ExtentReporting.html");
extent = new ExtentReports();
extent.attachReporter(htmlReporter);
}
@AfterMethod
public void getResult(ITestResult result) {
if (result.getStatus()==ITestResult.FAILURE) {
extentTest.fail(MarkupHelper.createLabel(result.getName()+" Test Case Failed", ExtentColor.RED));
extentTest.fail(result.getThrowable());
}
else if (result.getStatus()==ITestResult.SUCCESS) {
extentTest.pass(MarkupHelper.createLabel(result.getName()+" Test Case Passed", ExtentColor.GREEN));
extentTest.pass(result.getThrowable());
}
else {
extentTest.skip(MarkupHelper.createLabel(result.getName()+" Test Case Skipped", ExtentColor.ORANGE));
extentTest.skip(result.getThrowable());
}
}
@AfterSuite
public void tearDown() {
extent.flush();
}
}
TestNG XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Free CRM Test Application Regression Test Suite">
<listeners>
<listener class-name="com.crm.qa.ExtentReport.ExtentReportListener">
</listener>
</listeners>
<test thread-count="5" name="Free CRM app regression test cases">
<classes>
<class name="com.crm.qa.pages.testcases.LoginPageTest"/>
<class name="com.crm.qa.pages.testcases.HomePageTest"/>
<class name="com.crm.qa.pages.testcases.ContactsPageTest"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
解决方案
TestNG 正在按设计工作。
每当您在 testng 套件 xml 文件中添加如下条目时
<listeners>
<listener class-name="com.crm.qa.ExtentReport.ExtentReportListener"/>
</listeners>
TestNG 期望该类实现的子接口之一org.testng.ITestNGListener
您的班级没有这样做,这就是触发异常的原因。
请阅读相关范围报告文档以了解如何正确使用范围报告。
推荐阅读
- python - 如何在特定条件下计算熊猫数据框中的数据
- algorithmic-trading - 有谁知道如何计算自进入以来的周期数?
- javascript - node/v8 中重写的 getter 性能下降
- google-apps-script - 如何在多个电子表格选项卡上运行脚本
- perl - perl:在 macOS 11 Big Sur 上安装 File::HomeDir 时遇到问题
- rust - 将字符串写入文件
- python - Python CSV文件输入,验证不起作用
- c# - Open XML SDK 以正确的数字格式将 Double Value 写入 Excel 单元格
- string - 在 Julia 中将浮点或字符串类型的数组转换为 int 类型(从 Python 复制 int())
- python-3.x - python - 如何为python中的每个折叠交叉验证获取错误分类的实例及其索引?