Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Тесты падают с NullPointerException для методов CommonPage

page-object
webdriver
testng
Теги: #<Tag:0x00007f7b64fb6238> #<Tag:0x00007f7b64fb60d0> #<Tag:0x00007f7b64fb5f90>

(Excello) #1

Делаю тесты на проверку отображения товаров и фильтров в каталоге с помощью testng + pageobject

Столкнулся с проблемой, что тесты падают с NullPointerException для методов isProductsDisplayed, isFilterSectionDisplayed, isAnyFilterExisted. Сами методы находятся на Common…Page. Для каждой страницы каталога есть отдельный метод на проверку каталога.

Я так понимаю, что drivier = null и надо его инициализировать с каким-то значением.

Cannot instantiate class CatalogVerifying
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:38)
at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:380)
at org.testng.internal.ClassHelper.createInstance(ClassHelper.java:293)
at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:115)
at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:200)
at org.testng.internal.TestNGClassFinder.(TestNGClassFinder.java:120)
at org.testng.TestRunner.initMethods(TestRunner.java:409)
at org.testng.TestRunner.init(TestRunner.java:235)
at org.testng.TestRunner.init(TestRunner.java:205)
at org.testng.TestRunner.(TestRunner.java:153)
at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:536)
at org.testng.SuiteRunner.init(SuiteRunner.java:159)
at org.testng.SuiteRunner.(SuiteRunner.java:113)
at org.testng.TestNG.createSuiteRunner(TestNG.java:1299)
at org.testng.TestNG.createSuiteRunners(TestNG.java:1286)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29)
… 18 more
Caused by: java.lang.NullPointerException
at pages.CommonCatalogPage.isProductsDisplayed(CommonCatalogPage.java:87)
at CatalogVerifying.(CatalogVerifying.java:13)
… 23 more


(Dummy Name) #2

Привет!

Проблема в том, что объект класса CatalogVerifying инициализируется еще до того, как проинициализируется сам драйвер в @BeforeMethod

Получается, что сначала вы хотите создать объект страницы, передав драйвер в конструктор, но BeforeMethod еще не отработал

Нужно подумать, как правильно инициализировать страницы переда запуском тестов


(Excello) #3

А есть какие-нибудь варианты (шаблоны), чтобы обойти NPE?
Создавать объекты страницы для каждого теста?


(Dummy Name) #4

Как вариант


(Excello) #5

То есть для каждого теста придётся инициализировать объекты класса Commonpage и подтягивать оттуда методы?

Попробовал для одного теста, переместил инициализацию в тест. Словил Test ignored.
java.lang.NoClassDefFoundError: javax/xml/bind/ValidationEventLocator
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1007)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:801)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:699)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:622)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at ru.yandex.qatools.allure.testng.AllureTestListener.onStart(AllureTestListener.java:76)
at org.testng.TestRunner.fireEvent(TestRunner.java:1239)
at org.testng.TestRunner.beforeRun(TestRunner.java:636)
at org.testng.TestRunner.run(TestRunner.java:609)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)
at org.testng.SuiteRunner.run(SuiteRunner.java:254)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.ValidationEventLocator
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
… 24 more


#6

Именно.

Каждый тест должен описывать шаги таги теста и существовать независимо от других тестов.