在运行时使用唯一名称为每个步骤命名屏幕截图

时间:2018-05-09 14:15:09

标签: java selenium testng screenshot extentreports

我正在使用Selenium WebDriver和Java进行自动化,而TestNG是我的框架。我正在运行登录测试,其中我记录了范围报告中的每个步骤。我有每个步骤的功能,每个步骤,我附上一个截图。

我不确定如何使用唯一的描述性名称命名每个屏幕截图。我尝试获取当前方法(步骤)的名称,但似乎我需要创建一个匿名类eveytime和eveywhere来获取当前运行的方法名称,如下面的代码。

\1\r\n

这是我的代码。

\1

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

当然,有很多选择:

  1. 如果您不关心文件名是什么,可以使用File.createTempFile()UUID.randomUUID()来获取名称。这在语义上没有意义,但它可以很容易地为你提供独特的文件名。
  2. 如果每个测试不需要多个文件名,则可以使用测试名称。在JUnit中,您可以使用Test-Name Rule。对于TestNG,似乎other solutions使用@Before方法。即使您确实需要倍数,也可以将test-name-rule与序列号组合在一起。
  3. 您可以使用序列号,如静态变量/单例中的整数。它不是很复杂,但它仍然可以工作。 ;)
  4. Java并不会让获取当前方法名称变得特别容易,因此您要么必须执行匿名对象或获取堆栈跟踪,要么是有点痛苦而且不是特别高效。
  5. 以#2为例,您可以修改代码,例如:

    @Test(priority = 0, testName="Verify Login")
    public void login(ITestContext context) throws Exception {
        lp = new LoginPage(driver, test);
        tm = new TabMenu(driver, test);
        driver.get(Constants.url);
        lp.verifyLoginPageLogo(context.getName(), 0);
        lp.setUserName("admin");
        lp.setPassword("admin");
        lp.clickLoginBtn();
        tm.isCurrentTab("Dashboard", context.getName(), 1);
    }
    
    public void verifyLoginPageLogo(String testName, int stepName) throws IOException {
        String name = new Object(){}.getClass().getEnclosingMethod().getName();
        Assert.assertTrue(loginLogo.isDisplayed());
        test.log(LogStatus.PASS, "Logo is displayed", Screenshots.takeScreenshot(driver, testName, stepName, test));      
    }
    
    public static String takeScreenshot(WebDriver driver, String testName, int stepName, ExtentTest test) throws IOException {
        String fileName = testName + "_" + stepName ".png";
        // the rest of your screenshot code
    }
    

    您甚至可以用另一个语义上有意义的单词“loginLogo”,“dashboardTab”替换步骤编号,如果这有用