В ходе теста необходимо переходить с одной страницы на другую - заполняются поля, нажимается кнопка Save, происходит переход на следующую страницу.
В IExplorer при переходе на следующую страницу тест постоянно падает с NullPointerException.
По сути, тест пытается начать проверки на новой странице не дождавшись, пока она появится. После каждого нажатия на кнопку Save в методе прописаны ожидания около 5 секунд
public void clickSaveButton() {
saveButton.click();
waitABit(7000);
}
Следующий шаг на новой странице так же начинается с паузы:
public void checkPageElements() {
waitABit(1500);
assertTrue("Greeting isn't present on page", element(greetingText).isPresent());
Ранее время таймаута для ожидания элемента было переутановлено в конструкторе страницы, от которой наследуются все остальные страницы: (это не помогло)
public MainPage (WebDriver driver) {
super(driver);
setWaitForTimeout(20 * ONE_SECOND);
}
Действительно, после нажатия на кнопку Save страница перегружается не моментально, а в зависимости от нагрузки сервера это занимает от одной до пяти секунд (паузы выставлены на 7 секунд). В это время идет бегунок.
Как я упомянала в более ранних вопросах, в этом тесте для IE все методы аяксовых ожиданий не работают совсем.
Причин возникновения NullPointerException может быть много, но суть в том, что вы (или используемые библиотеки) пытаетесь обратиться к объекту, который не создан (или явно установлен в значение null). Смотрите полный стектрейс при возникновении NullPointerException - он вам покажет конкретно при вызове какого метода возникла ошибка. Без этой информации помочь вам трудно.
Текст Exception-а вам по NDA запрещено на форум выкладывать? Или вы считаете это не важно в вашем вопросе? И код, в котором этот эксепшн происходит тоже будет совсем не лишним. Тогда возможно кто-то сможет дать полезный ответ
P.S. господа и дамы, вроде все тестировщики и багрепорты-то уж умеем писать? Чего стесняемся подробности ошибки показывать?
net.thucydides.core.webdriver.WebdriverAssertionError: java.lang.NullPointerException
at lv.test.steps.LogoutPageSteps.assertLogoutMessage(LogoutPageSteps.java:21)
at lv.test.steps.LogoutPageSteps$$EnhancerByCGLIB$$bd5b73e2.CGLIB$assertLogoutMessage$0(<generated>)
at lv.test.steps.LogoutPageSteps$$EnhancerByCGLIB$$bd5b73e2$$FastClassByCGLIB$$703f01f8.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at net.thucydides.core.steps.StepInterceptor.invokeMethod(StepInterceptor.java:294)
at net.thucydides.core.steps.StepInterceptor.invokeMethodAndNotifyFailures(StepInterceptor.java:211)
at net.thucydides.core.steps.StepInterceptor.runNormalMethod(StepInterceptor.java:204)
at net.thucydides.core.steps.StepInterceptor.testStepResult(StepInterceptor.java:119)
at net.thucydides.core.steps.StepInterceptor.intercept(StepInterceptor.java:53)
at lv.test.steps.LogoutPageSteps$$EnhancerByCGLIB$$bd5b73e2.assertLogoutMessage(<generated>)
at lv.test.LoginOnPage.AnswerOnSecurityQuestions(LoginOnPage.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at net.thucydides.junit.runners.ThucydidesStatement.evaluate(ThucydidesStatement.java:21)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at net.thucydides.junit.runners.ThucydidesRunner.runChild(ThucydidesRunner.java:387)
at net.thucydides.junit.runners.ThucydidesRunner.runChild(ThucydidesRunner.java:60)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at net.thucydides.junit.runners.ThucydidesRunner.run(ThucydidesRunner.java:234)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.NullPointerException
... 40 more
546101 [main] INFO net.thucydides.core.requirements.ClasspathRequirementsProviderService - Using requirements providers: [net.thucydides.core.statistics.service.AnnotationBasedTagProvider@63baf331, net.thucydides.core.statistics.service.FeatureStoryTagProvider@6b4491e, net.thucydides.core.requirements.FileSystemRequirementsTagProvider@262c5402]
Process finished with exit code -1
Так уже лучше. Из первой строки видно, что ошибка происходит в assert-методе в шаге (на странице) LogoutPageSteps. Давайте теперь код из строки 21 класса LogoutPageSteps. Ну и контекст для этой строки тоже покажите (что за код вокруг этой строки, можно весь метод, если он небольшой)
P.S. пока не видно, насколько это связано с медленной работой IE
В ФФ этот же самый тест проходит без ошибок в 10 случаях из 10
Я отслеживала глазами прохождение теста и у меня сложилось впечатление, что драйвер не дожидается перехода страницы
В ФФ этот же самый тест проходит без ошибок в 10 случаях из 10 Я отслеживала глазами прохождение теста и у меня сложилось впечатление, что драйвер не дожидается перехода страницы
Не верьте глазам, используйте дебаг
Когда драйвер не дожидается он выкидывает TimeoutException. А в данном случае видно, что строку с findElement он прошел, следовательно элемент он нашёл. Но только метод getText() возвращает null.
Либо webdriver для FF и IE по-разному обрабатывают вашу страницу, либо верстка страницы под IE отличается от FF. Найдите правильный xpath, который будет одинаково работать под все нужные браузеры и всё заработает. И паузы можно будет поубирать