Падает с ошибкой TestWatcher не находит драйвер

Пытаюсь настроить, чтобы делал скрин если тест падает

public class ScreenshotExtension implements TestWatcher {
    @Override
    public void testFailed(ExtensionContext context, Throwable throwable){
        WebDriver driver = getDriver(context);

        Allure.getLifecycle().addAttachment(
                "Screenshot",
                "image/png", "png",
                ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES)
        );
    }

    @Override
    public void testDisabled(ExtensionContext context, Optional<String> reason) {
        getDriver(context).close();
    }

    @Override
    public void testSuccessful(ExtensionContext context) {
        getDriver(context).close();

    }

    @Override
    public void testAborted(ExtensionContext context, Throwable cause) {
        getDriver(context).close();
    }

    private WebDriver getDriver(ExtensionContext context) {
        Object instance = context.getRequiredTestInstance();

        try {
            Field field = instance.getClass().getDeclaredField("driver");
            field.setAccessible(true);
            return  (WebDriver) field.get(instance);
        } catch (NoSuchFieldException | IllegalAccessException e){
            throw new RuntimeException(e);
        }
    }
}

драйвер у меня идет от класса utils в котором его инизиализирую ,а потом передаю в basePaige и от него конструктор ,что-то вроде синглтона

public class Utils {

    private static WebDriver driver;


    public static WebDriver getDriver() {
        return driver;
    }


    @BeforeAll
    public static void setUp() {
        WebDriverManager.chromedriver().setup();
        driver = DriverFactory.getWebDriver(Browsers.CHROME);
        driver.manage().window().maximize();


    }


    @AfterAll
    public static void rearDown() {
        driver.quit();

Спасибо за помощь,объясните пожалуйста как настроить
падает с ошибкой не находит драйвер java.lang.RuntimeException: java.lang.NoSuchFieldException: driver

В первую очередь не играть с рефлексией там где в этом нет ни смысла ни нужды.

Говорит о том что вот в этой части:

Не получается извлечь поле driver.
Опять же, рефлексия предполагает, что человек который её использует абсолютно точно знает и понимает что делает и зачем. Из постановки вопроса создаётся впечатление что таким пониманием и не пахнет. У объекта, ExtensionContext (и у его getRequiredTestInstance) который залетает как аргумент нет поля driver. Что в общем-то и не удивительно. Чтобы попробовать это понять давайте ещё раз по логике:

Т.е. Драйвер хранится НЕ в тестовом классе, а где то в пейджах. Однако в ScreenshotExtension.getDriver(ExtensionContext context); Происходит попытка выдрать драйвер именно из теста, а не из пейджи. На что, собственно, java и ругается.

Самым простым способом будет просто заимпортить в статику getDriver класса Utils.

import static bla.bla.bla.utils.Utils.getDriver;

Либо вносить driver как поле класса, но это тоже решение не айс.

1 лайк

Спасибо работает импорт getDriver и создает скриншоты, можете подсказать как мне брать драйвер из paige ,чтобы не импортировать статический getdriver.
Спасибо за помощь

это понятно,но с чего-то нужно начинать,если к этому вообще не прикасаться,тогда и не освою,а тут потихоньку с практикой придет понимание

В пейджу драйвер передаётся для того чтобы работать в ней. Драйвер может быть передан в тест, чтобы он (тест) сам делал нужные ему пейджи. По-хорошему считается что в рефлексию лезут в двух случаях:

  1. Имеются проблемы с архитектурой, которые по-другому не решаются.
  2. Чтобы значительно упростить жизнь и не городить тонны кода в исполняемой части, например в каждом тесте.

Хорошей практикой может быть использовать рефлексию чтобы повесить нестандартный функционал на тест. Например написать свою аннотацию @Monitoring. Если она висит на тесте, то сразу по окончанию этого теста, летит нотификация куда-нибудь в мессенджер.

2 лайка

Да вы правы,разобрался рано мне еще и совсем не по назначению полез. Спасибо за помощь.