Java 如何在ItestListener中获取当前类驱动程序
我正在为我的testng selenium java项目与ExtentReports和ItestListener合作, 我的监听器为ExtentReports的failes测试用例截图,但问题是我的testng.XML中有多个类,我一次运行它们,一个接一个地执行不同的操作,并拥有自己的驱动程序 在失败的情况下,Ilistener的代码为-Java 如何在ItestListener中获取当前类驱动程序,java,selenium-webdriver,testng,extentreports,Java,Selenium Webdriver,Testng,Extentreports,我正在为我的testng selenium java项目与ExtentReports和ItestListener合作, 我的监听器为ExtentReports的failes测试用例截图,但问题是我的testng.XML中有多个类,我一次运行它们,一个接一个地执行不同的操作,并拥有自己的驱动程序 在失败的情况下,Ilistener的代码为- public void onTestFailure(ITestResult iTestResult) { System.out.println("I
public void onTestFailure(ITestResult iTestResult)
{
System.out.println("I am in onTestFailure method " +
getTestMethodName(iTestResult) + " failed");
//Get driver from BaseTest and assign to local webdriver variable.
Object testClass = iTestResult.getInstance();
WebDriver webDriver = ((BaseTest) testClass).getDriver();
//Take base64Screenshot screenshot.
String base64Screenshot = "data:image/png;base64,"+((TakesScreenshot)webDriver).
getScreenshotAs(OutputType.BASE64);
//Extentreports log and screenshot operations for failed tests.
ExtentTestManager.getTest().log(LogStatus.FAIL,"Test Failed",
ExtentTestManager.getTest().addBase64ScreenShot(base64Screenshot));
}
如何确保在测试用例失败时使用失败测试用例类的驱动程序,因为在上面的代码中始终只提供了一个类的驱动程序,而不是当前类的驱动程序。对于非静态驱动程序,我找到了一个解决方案,当您有多个具有自己的驱动程序并运行自己的功能的类时,您可以使用驱动程序初始化和getdriver函数设置基类,该函数将从基类获取驱动程序,并从其他类扩展该类-
class BaseClass
{
WebDriver driver;
public WebDriver getDriver()
{
system.setproperty()
driver=new ChromeDriver();
return driver;
}
Class Test1 extends BaseClass
{
BaseClass bc=new BaseClass()
@BeforTest
public void setup()
{
driver=bc.getDriver()
//rest processing
}
很简单,您可以在测试类中设置该属性,然后在侦听器类中调用该属性 比如说 testClass.java
@BeforeClass
public void setDriver(ITestContext context){
Webdriver driver = new FirefoxDriver();
context.setAttribute("WebDriver", driver);
}
@Test
public void t1(){
// your code
}
Listener.java
WebDriver driver = null;
@Override
public void onTestFailure(ITestResult result) {
ITestContext context = result.getTestContext();
driver = (WebDriver) context.getAttribute("WebDriver");
// your code
}
这里您需要注意,在测试类中,您需要设置driver属性,然后在该侦听器中调用该属性一次。您在测试类和侦听器类中的驱动程序将是相同的另一种方法可以是(顺便说一句,上面的方法也适用于我-Suhail的答案)
从侦听器类尝试访问webDriver(也可以在其他侦听器方法上调用)
乍一看,这里没有明显的问题。也许您还可以包含BaseTest类的一些片段,其中包含
驱动程序字段定义和初始化,因为这将有助于识别任何问题。
public class WhereWebDriverIsDefined {
public WebDriver webDriver;
//initialize driver in @BeforeTest or @BeforeClass method
@BeforeTest
public void init() {
System.setProperty("webdriver.chrome.driver","D:\\WebDriverLocation\\chromedriver.exe");
driver= new ChromeDriver();
}
public void onTestFailure(ITestResult result) {
WebDriver driver= null;
try {
driver= (WebDriver) result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance());
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
}