Mobile Automation - Тестирование нестатического драйвера. Метод TakeScreenshot выдает ошибку NPE с параллельными потоками.
Я застрял с исключением нулевого указателя при создании снимка экрана для неудачных шагов в моем наборе тестов. Я искал решение этой проблемы в Google, но у меня пока ничего не получалось. Спасибо, если кто-нибудь может посоветовать.
У меня есть 2 класса тестирования Android и 2 класса тестирования iOS. И Android, и iOS имеют собственную базовую программу для инициализации драйвера Android/iOS (объявлена как нестатическая). Тестовые классы вызывают базовую программу для инициализации драйвера (как this.driver = .initiaze()) для параллельного запуска всех 4 тестовых классов.
У меня есть 2 отдельных слушателя (чтобы сделать скриншот при сбое) один для Android и один для iOS. Когда какой-либо тест завершается неудачей, программа-слушатель вызывает (android listener вызывает android base, а ios вызывает ios base), метод базовых программ получает метод снимка экрана, который затем завершается с ошибкой NPE.
Ниже приведен пример кода для ссылки.
(Примечание: если я определяю драйвер как открытый статический в базовой программе, то ошибка NPE исчезает, но параллельный запуск завершается ошибкой со случайной ошибкой, поскольку драйвер одного класса используется другим классом)
База Android: (аналог кода для iOS Base с типом возврата как IOSDriver)
g_MobileBase.java:
public class g_MobileBase {
@SuppressWarnings("rawtypes")
public AndroidDriver driver=null;
public DesiredCapabilities cap;
@SuppressWarnings("rawtypes")
public AndroidDriver InitializeDriver() throws IOException
{//initialization code; return driver;
}
public void getScreenshot(String classname, String testname) throws IOException
{
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(src,new File(System.getProperty("user.dir")+"\\ErrorSnapshots\\"+classname+"_"+testname+"_"+new SimpleDateFormat("yyyy-MM-dd hh-mm-ss").format(new Date())+".png"));
}
}
Тестовый класс Android № 1:
public class G_SearchStore_LocOff extends g_MobileBase{
@BeforeTest (description="Initialize driver and install application")
public void Initialize() throws IOException
{
this.driver = InitializeDriver();
//remaining code
}
@AfterTest (description="Close application and Quit driver")
public void finish()
{
driver.closeApp();
driver.quit();
}
@Test
.................some methods
.................some methods
}
Прослушиватель Android: (аналогичен для прослушивателя iOS только для создания объекта базовой программы ios)
public class g_testListener implements ITestListener{
g_MobileBase b = new g_MobileBase();
@Override
public void onTestFailure(ITestResult result) {
// TODO Auto-generated method stub
String[] temp = result.getInstanceName().toString().split("\\.");
String classname = temp[1];
try {
b.getScreenshot(classname,result.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
1 ответ
Проблема заключается в вашем тестовом коде.
TestNG по функциональности вызывает @BeforeTest
только один раз за <test>
тег. Так что если в вашем <test>
есть несколько тестовых классов, которые пытаются использовать экземпляр webdriver, и если этот экземпляр webdriver инициализируется через @BeforeTest
метод, то для второго экземпляра экземпляр веб-драйвера будет нулевым.
Чтобы обойти эту проблему, пожалуйста, замените @BeforeTest
аннотация с @BeforeClass
аннотаций.