diff --git a/.gitignore b/.gitignore index 5d808cd..74b6467 100644 Binary files a/.gitignore and b/.gitignore differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8326355 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +Изменён pom файл для отображения allure отчётов. +Успешно собирается в allure-reports/ + +Добавлена возможность скриншотов по шагам +``` +AllureUtils.attachScreenshot() +``` + +а также при ошибках + +```@Rule +public MyAllureListener allureListener = new MyAllureListener(); +``` + + +``` +public class MyAllureListener extends TestWatcher { + + @Override + protected void failed(Throwable e, Description description) { + takeScreenshot(); + } + + @Attachment(value = "Screenshot on failure", type = "image/png") + public byte[] takeScreenshot() { + return ((TakesScreenshot) DriverManager.getDriverManager().getDriver()) + .getScreenshotAs(OutputType.BYTES); + } +} +``` + +![img.png](img.png) + diff --git a/img.png b/img.png new file mode 100644 index 0000000..a786e2c Binary files /dev/null and b/img.png differ diff --git a/pom.xml b/pom.xml index 9adfd42..c45d3d0 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,88 @@ test + + io.qameta.allure + allure-junit4 + 2.13.5 + + + + org.aspectj + aspectjweaver + 1.9.7 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + true + + -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar" + + + ${project.build.directory}/allure-results + + + + listener + io.qameta.allure.junit4.AllureJunit4 + + + + + + + org.aspectj + aspectjweaver + 1.9.7 + + + + + + + + io.qameta.allure + allure-maven + 2.10.0 + + 2.10.0 + ${project.build.directory}/allure-results + ${project.build.directory}/allure-report + + + + report + verify + + report + + + + + + + + diff --git a/src/test/java/ru/ibs/framework/managers/TestPropManager.java b/src/test/java/ru/ibs/framework/managers/TestPropManager.java index bf482c6..2827770 100644 --- a/src/test/java/ru/ibs/framework/managers/TestPropManager.java +++ b/src/test/java/ru/ibs/framework/managers/TestPropManager.java @@ -12,7 +12,7 @@ public class TestPropManager { try (FileInputStream fis = new FileInputStream("environment.properties")) { properties.load(fis); } catch (IOException e) { - throw new RuntimeException("Не удалось загрузить environment.properties", e); + throw new RuntimeException("Неудалось загрузить environment.properties", e); } } diff --git a/src/test/java/ru/ibs/framework/utils/AllureUtils.java b/src/test/java/ru/ibs/framework/utils/AllureUtils.java new file mode 100644 index 0000000..17b864c --- /dev/null +++ b/src/test/java/ru/ibs/framework/utils/AllureUtils.java @@ -0,0 +1,15 @@ +package ru.ibs.framework.utils; + +import io.qameta.allure.Attachment; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.TakesScreenshot; +import ru.ibs.framework.managers.DriverManager; + +public class AllureUtils { + + @Attachment(value = "Screenshot at step", type = "image/png") + public static byte[] attachScreenshot() { + return ((TakesScreenshot) DriverManager.getDriverManager().getDriver()) + .getScreenshotAs(OutputType.BYTES); + } +} \ No newline at end of file diff --git a/src/test/java/ru/ibs/framework/utils/MyAllureListener.java b/src/test/java/ru/ibs/framework/utils/MyAllureListener.java new file mode 100644 index 0000000..2938605 --- /dev/null +++ b/src/test/java/ru/ibs/framework/utils/MyAllureListener.java @@ -0,0 +1,22 @@ +package ru.ibs.framework.utils; + +import io.qameta.allure.Attachment; +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.TakesScreenshot; +import ru.ibs.framework.managers.DriverManager; + +public class MyAllureListener extends TestWatcher { + + @Override + protected void failed(Throwable e, Description description) { + takeScreenshot(); + } + + @Attachment(value = "Screenshot on failure", type = "image/png") + public byte[] takeScreenshot() { + return ((TakesScreenshot) DriverManager.getDriverManager().getDriver()) + .getScreenshotAs(OutputType.BYTES); + } +} diff --git a/src/test/java/ru/ibs/tests/ApplineBusinessTripTest.java b/src/test/java/ru/ibs/tests/ApplineBusinessTripTest.java new file mode 100644 index 0000000..2d67a06 --- /dev/null +++ b/src/test/java/ru/ibs/tests/ApplineBusinessTripTest.java @@ -0,0 +1,63 @@ +package ru.ibs.tests; + +import org.junit.*; +import org.openqa.selenium.By; +import ru.ibs.framework.managers.DriverManager; +import ru.ibs.framework.utils.AllureUtils; +import ru.ibs.framework.utils.MyAllureListener; + +public class ApplineBusinessTripTest extends BaseTests { + + private LoginPage loginPage; + private DashboardPage dashboardPage; + private BusinessTripPage businessTripPage; + + @Rule + public MyAllureListener allureListener = new MyAllureListener(); + + @Before + public void setUp() { + // Получаем драйвер из DriverManager (инициализирован в BaseTests) + loginPage = new LoginPage(DriverManager.getDriverManager().getDriver()); + + // Открываем страницу логина + DriverManager.getDriverManager().getDriver().get("http://training.appline.ru/user/login"); + } + + @Test + public void applineLoginScenario() { + AllureUtils.attachScreenshot(); + dashboardPage = loginPage.login("Irina Filippova", "testing"); + Assert.assertTrue("Dashboard not loaded", dashboardPage.isDashboardLoaded()); + + businessTripPage = dashboardPage.goToBusinessTrip(); + Assert.assertTrue("Trips page not loaded", businessTripPage.isTripsPageLoaded()); + + businessTripPage.openCreateTripForm(); + + businessTripPage.selectDepartment("Отдел внутренней разработки"); + businessTripPage.selectOrganization("Edge"); + businessTripPage.setTicketsCheckbox(true); + businessTripPage.fillCity("Дмитров"); + + AllureUtils.attachScreenshot(); + + businessTripPage.fillDate( + By.xpath("//input[@placeholder='Укажите дату' and contains(@id, 'departureDatePlan')]"), + "01.01.2025" + ); + + businessTripPage.fillDate( + By.xpath("//input[@placeholder='Укажите дату' and contains(@id, 'returnDatePlan')]"), + "10.01.2025" + ); + + AllureUtils.attachScreenshot(); + + businessTripPage.saveAndClose(); + + Assert.assertTrue("Expected validation error not shown", + businessTripPage.isErrorDisplayed("Список командируемых сотрудников не может быть пустым")); + } + +} diff --git a/src/test/java/ru/ibs/tests/BusinessTripPage.java b/src/test/java/ru/ibs/tests/BusinessTripPage.java index 892d905..ad36606 100644 --- a/src/test/java/ru/ibs/tests/BusinessTripPage.java +++ b/src/test/java/ru/ibs/tests/BusinessTripPage.java @@ -8,8 +8,8 @@ import org.openqa.selenium.support.ui.*; import java.time.Duration; public class BusinessTripPage { - private WebDriver driver; - private WebDriverWait wait; + private final WebDriver driver; + private final WebDriverWait wait; @FindBy(xpath = "//h1[contains(text(), 'Командировки')]") private WebElement tripsHeader; @@ -77,7 +77,6 @@ public class BusinessTripPage { scrollToElement(cityInput); cityInput.clear(); cityInput.sendKeys(city); - // Optionally assert } public void fillDate(By dateLocator, String dateValue) { @@ -86,7 +85,6 @@ public class BusinessTripPage { dateInput.clear(); dateInput.sendKeys(dateValue); dateInput.sendKeys(Keys.TAB); - // Optionally assert } public void saveAndClose() { diff --git a/src/test/java/ru/ibs/tests/TestTrainingAppline.java b/src/test/java/ru/ibs/tests/TestTrainingAppline.java deleted file mode 100644 index 903d21b..0000000 --- a/src/test/java/ru/ibs/tests/TestTrainingAppline.java +++ /dev/null @@ -1,89 +0,0 @@ -package ru.ibs.tests; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.openqa.selenium.*; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; - -import java.time.Duration; - -public class TestTrainingAppline { - - private WebDriver driver; - private WebDriverWait wait; - Duration default_timeout = Duration.ofSeconds(10); - Duration default_sleep = Duration.ofMillis(500); - String fieldXPath = "//input[@id='%s']"; - - @Before - public void before() { - // win - System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe"); - - driver = new ChromeDriver(); - driver.manage().window().maximize(); - driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30)); - driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(30)); - - wait = new WebDriverWait(driver, default_timeout, default_sleep); - - String baseUrl = "http://training.appline.ru/user/login"; - driver.get(baseUrl); - } - - @Test - public void applineLoginScenario() throws InterruptedException { - - WebElement usernameField = driver.findElement(By.xpath(String.format(fieldXPath, "prependedInput"))); - fillInputField(usernameField, "Irina Filippova"); - - WebElement passwordField = driver.findElement(By.xpath(String.format(fieldXPath, "prependedInput2"))); - fillInputField(passwordField, "testing"); - - // Нажать на кнопку Войти - String buttonLocator = "//button[@type='submit']"; - WebElement loginButton = driver.findElement(By.xpath(buttonLocator)); - scrollToElementJs(loginButton); - waitUtilElementToBeClickable(loginButton); - loginButton.click(); - - Thread.sleep(5000); - } - - @After - public void after() { - driver.quit(); - } - - private void scrollToElementJs(WebElement element) { - JavascriptExecutor javascriptExecutor = (JavascriptExecutor) driver; - javascriptExecutor.executeScript("arguments[0].scrollIntoView(true);", element); - } - - private void waitUtilElementToBeClickable(WebElement element) { - wait.until(ExpectedConditions.elementToBeClickable(element)); - } - - private void waitUtilElementToBeVisible(By locator) { - wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); - } - - private void waitUtilElementToBeVisible(WebElement element) { - wait.until(ExpectedConditions.visibilityOf(element)); - } - - private void fillInputField(WebElement element, String value) { - scrollToElementJs(element); - waitUtilElementToBeClickable(element); - element.click(); - element.clear(); - element.sendKeys(value); - boolean checkFlag = wait.until(ExpectedConditions.attributeContains(element, "value", value)); - Assert.assertTrue("Поле было заполнено некорректно", checkFlag); - } - -} diff --git a/src/test/resources/chromedriver.exe b/src/test/resources/chromedriver.exe deleted file mode 100644 index 148462f..0000000 Binary files a/src/test/resources/chromedriver.exe and /dev/null differ