Selenium + Thucydides. NullPointerException при переходе на новую страницу в IExplorer


(Natalja Librante Lace) #1

В ходе теста необходимо переходить с одной страницы на другую - заполняются поля, нажимается кнопка 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 все методы аяксовых ожиданий не работают совсем.


(Aleksey) #2

Причин возникновения NullPointerException может быть много, но суть в том, что вы (или используемые библиотеки) пытаетесь обратиться к объекту, который не создан (или явно установлен в значение null). Смотрите полный стектрейс при возникновении NullPointerException - он вам покажет конкретно при вызове какого метода возникла ошибка. Без этой информации помочь вам трудно.


(Александр Таранков) #3

Текст Exception-а вам по NDA запрещено на форум выкладывать? Или вы считаете это не важно в вашем вопросе? И код, в котором этот эксепшн происходит тоже будет совсем не лишним. Тогда возможно кто-то сможет дать полезный ответ

P.S. господа и дамы, вроде все тестировщики и багрепорты-то уж умеем писать? Чего стесняемся подробности ошибки показывать?


(Natalja Librante Lace) #4

Трейс ошибки

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

(Александр Таранков) #5

Так уже лучше. Из первой строки видно, что ошибка происходит в assert-методе в шаге (на странице) LogoutPageSteps. Давайте теперь код из строки 21 класса LogoutPageSteps. Ну и контекст для этой строки тоже покажите (что за код вокруг этой строки, можно весь метод, если он небольшой)

P.S. пока не видно, насколько это связано с медленной работой IE


(Natalja Librante Lace) #6

Метод вокруг строки 21:

public class LogoutPageSteps extends ScenarioSteps {
        public LogoutPageSteps(Pages pages) {
            super(pages);
        }

        public LogoutPage getCurrentPage() {
            return getPages().currentPageAt(LogoutPage.class);

        }

        public void assertLogoutMessage() {
            getCurrentPage().assertLogoutMessage(); \\собственно 21-я строка
        }
    }

И сам метод assertLogoutMessage() (класс LogoutPage)

public void assertLogoutMessage() {
        waitABit(2000);
        String logoutMessage = getDriver().findElement(By.xpath("html/body/p")).getText();
        assertTrue("Logout Message is wrong", logoutMessage.equalsIgnoreCase("You have finished session.")||
                logoutMessage.equalsIgnoreCase("Вы завершили сессию."));                                                                                                                          }
}

(Natalja Librante Lace) #7

В ФФ этот же самый тест проходит без ошибок в 10 случаях из 10
Я отслеживала глазами прохождение теста и у меня сложилось впечатление, что драйвер не дожидается перехода страницы


(Александр Таранков) #8

подебажте возвращаемое здесь значение и выясните почему под IE здесь null получается


(Александр Таранков) #9

В ФФ этот же самый тест проходит без ошибок в 10 случаях из 10 Я отслеживала глазами прохождение теста и у меня сложилось впечатление, что драйвер не дожидается перехода страницы

Не верьте глазам, используйте дебаг smile

Когда драйвер не дожидается он выкидывает TimeoutException. А в данном случае видно, что строку с findElement он прошел, следовательно элемент он нашёл. Но только метод getText() возвращает null.

Либо webdriver для FF и IE по-разному обрабатывают вашу страницу, либо верстка страницы под IE отличается от FF. Найдите правильный xpath, который будет одинаково работать под все нужные браузеры и всё заработает. И паузы можно будет поубирать