#java #testng #appium-android #extentreports
#java #testng #appium-Android #extentreports
Вопрос:
Попытка сделать снимок экрана при сбое теста. На самом деле происходит то, что, как только intellij переходит к моему @AfterMethod, он снова запускает приложение и делает снимок главного экрана.
Я попытался указать степень.flush(); в @AfterMethod и меняющий текущий @AfterMethod на @AfterTest
@AfterMethod
public synchronized void afterMethod(ITestResult result) throws IOException {
AppiumDriver<MobileElement> driver = MetricellTest.setupTests();
String screenShot = CaptureScreenShot.captureScreen(driver, CaptureScreenShot.generateFileName(result));
if (result.getStatus() == ITestResult.FAILURE) {
test.get().log(Status.FAIL, result.getName());
test.get().log(Status.FAIL, result.getThrowable());
test.get().fail("Screen Shot : " test.get().addScreenCaptureFromPath(screenShot));
test.get().fail(result.getThrowable());
} else if (result.getStatus() == ITestResult.SKIP) {
test.get().skip("Test Case : " result.getName() " has been skipped");
test.get().skip(result.getThrowable());
} else
test.get().pass("Test passed");
extent.flush();
}
}
Я ожидаю, что он будет делать скриншоты по мере прохождения, и тесты завершатся неудачей. В настоящее время он просто открывает приложение в конце теста и делает снимок главного экрана.
Комментарии:
1. Пожалуйста, добавьте также код для вашего метода
setupTests
, чтобы мы могли получить больше ясности в проблеме.2. @SameerArora Я добавил код метода setupTests
Ответ №1:
В @AfterMethod
вы driver
снова инициализируете setupTests
и вызываете setupTests
метод, и ваш в этом случае метод выполняет инициализацию приложения, из-за чего приложение снова открывается.
Итак, вам нужно внести следующие изменения в свой код, и тогда все будет работать нормально:
-
Объявите
AppiumDriver<MobileElement> driver
глобально вместо того, чтобы объявлять его вsetupTests
методе, чтобы его можно было использовать во всем классе. -
Удалите строку кода
AppiumDriver<MobileElement> driver =
из вашего
MetricellTest.setupTests();@AfterMethod
, потому что она снова инициализируетdriver
и приложение.
Обновленный ответ и добавление дополнительного объяснения:
Вы можете объявить driver
глобально следующим образом:
Итак, допустим, ваше имя класса testClass
, вы должны объявить driver
сразу после запуска кода для класса, как:
public class testClass{
AppiumDriver<MobileElement> driver;
// Add Rest of the code here
}
Комментарии:
1. Спасибо за ваш ответ. Как мне объявить drvier глобально?
2. @ TomCockram обновил мой ответ, пожалуйста, проверьте его сейчас
3. Спасибо, я внес эти изменения, но я получаю исключение нулевого указателя. Я устанавливаю драйвер следующим образом
public static AppiumDriver<MobileElement> AppiumDriver = null;
, что я не считаю правильным. Как я должен это делать?4. В какой строке вы получаете NPE?
5. Можете ли вы опубликовать весь код вашего класса в вопросе после внесения изменений, которые я предложил? Смог бы тогда помочь вам лучше