Selenium:如何从另一个类调用方法(截屏)

时间:2016-12-06 18:13:45

标签: java selenium testng

我有一个带有测试的课程(使用Selenium,TestNG,JAVA),结构如下:

public class messages {
    public void screenshot(ITestResult result) {

        //driver = new ChromeDriver();
        if (ITestResult.FAILURE == result.getStatus()) {
            try {
                TakesScreenshot ts = (TakesScreenshot) driver;
                File source = ts.getScreenshotAs(OutputType.FILE);
                Date date = new Date();
                FileUtils.copyFile(source, new File("./Screenshots/" + result.getInstanceName() + "." + result.getName() + "." + date + ".png"));
                System.out.println("Screenshot taken");
            } catch (Exception e) {

                System.out.println("Exception while taking screenshot " + e.getMessage());
            }
        }
    }

}

在AfterMethod中我想在测试失败时制作截图。 以下是在单独的类中进行屏幕截图的方法:

@AfterMethod
public void tearDown(ITestResult result) {


  if (ITestResult.FAILURE == result.getStatus()) {
    try {
        TakesScreenshot ts = (TakesScreenshot) driver;
        File source = ts.getScreenshotAs(OutputType.FILE);
        Date date = new Date();
        FileUtils.copyFile(source, new File("./Screenshots/" + result.getInstanceName() + "." + result.getName() + "." + date + ".png"));
        System.out.println("Screenshot taken");
    } catch (Exception e) {

        System.out.println("Exception while taking screenshot " + e.getMessage());
    }
  }
}

我正在运行测试,但它不起作用,如果此方法在其他类中。

但是如果我把它正确地放到@AfterMethod注释中,它正在工作,就像那样:

$ext = strstr($filename, '.');

这里的问题在哪里? 感谢

2 个答案:

答案 0 :(得分:2)

为什么名为.screenshot()的类中的messages函数?它似乎不属于那里或者messages应该重命名。

解决此问题的一种方法是创建一个Utils类,将其设为static,然后将.screenshot()函数放入其中,并将其称为Utils.screenshot()来自.tearDown() {1}}。

答案 1 :(得分:1)

很少 -

  1. 改进编写班级名称

    loggedTest - > LoggedTest

    messages - > Messages(如提及的那样)

  2. 您无需将Messages的实例传递给tearDown(),而是将screenshot方法调用为 -

    @AfterMethod
    public void tearDown(ITestResult result) {
        new Messages().screenshot(result);
    }
    
  3. 确保您的Messages班级了解现有driver的内容。除非你最终创造一个新的驱动程序和做事荒谬。建议 - 您可以在静态上下文中传递driver的实例,或者在那里使用超类。