Наименование снимка экрана для каждого шага с уникальным именем во время выполнения - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над Selenium WebDriver с Java для автоматизации, и TestNG - это мой фреймворк. Я выполняю проверку входа в систему, в которой я регистрирую каждый шаг в отчете экстента. У меня есть функция для каждого шага и для каждого шага, я прилагаю скриншот.

Я не уверен, как назвать каждый скриншот уникальным описательным именем. Я попытался получить имя текущего метода (шага), но мне кажется, что мне нужно создать анонимный класс eveytime и eveywhere, чтобы получить имя текущего метода выполнения согласно приведенному ниже коду.

String name = new Object(){}.getClass().getEnclosingMethod().getName();

Вот мой код.

@Test(priority = 0, testName="Verify Login")
public void login() throws Exception {
    lp = new LoginPage(driver, test);
    tm = new TabMenu(driver, test);
    driver.get(Constants.url);
    lp.verifyLoginPageLogo();
    lp.setUserName("admin");
    lp.setPassword("admin");
    lp.clickLoginBtn();
    tm.isCurrentTab("Dashboard");
}

public void verifyLoginPageLogo() throws IOException {
    String name = new Object(){}.getClass().getEnclosingMethod().getName();
    Assert.assertTrue(loginLogo.isDisplayed());
    test.log(LogStatus.PASS, "Logo is displayed", Screenshots.takeScreenshot(driver, name, test));      
}

public static String takeScreenshot(WebDriver driver, String name, ExtentTest test) throws IOException {

    String directory = "C:\\Users\\JACK\\Documents\\eclipse-workspace\\OrangeHRM\\Screenshots\\";
    String fileName = name + ".png";
    File destFile = new File(directory + fileName);
    TakesScreenshot ss = (TakesScreenshot) driver;
    File sourceFile = ss.getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(sourceFile, destFile);
    String imgPath = test.addScreenCapture(directory+fileName);
    return imgPath;
}

Есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 09 мая 2018

Конечно, есть много вариантов:

  1. Если вам все равно, какое имя файла, вы можете использовать File.createTempFile() или просто UUID.randomUUID(), чтобы получить имя. Это не будет семантически значимым, но достаточно легко даст вам уникальные имена файлов.
  2. Если вам не нужно несколько имен файлов для теста, вы можете использовать имя теста. В JUnit вы можете использовать Test-Name Rule . Для TestNG, похоже, существуют другие решения с использованием @Before методов. Даже если вам нужны множители, вы можете объединить test-name-rule с порядковым номером.
  3. Вы можете просто использовать порядковый номер, например, целое число в статической переменной / синглтоне. Это не очень сложно, но все равно будет работать. ;)
  4. Java не облегчает получение текущего имени метода, поэтому вам придется либо сделать свой анонимный объект, либо получить трассировку стека, в любом случае это немного болезненно и не особенно эффективно.

Используя # 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", если это полезно

...