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

При вызове методов цепочкой java.lang.NullPointerException


(Имя Фамилия) #1

Вызываю методы цепочкой

          Batch  batch = new Batch(driver)
     		.inStatusDropdownSelectItem("Not Started")
    		.btnSearch()
     	        .clickRandomElementInTable()
        	.clickbtnContinue();

Реализации самих методов:

 public Batch inStatusDropdownSelectItem(String item)
 	{       dropdownStatus.click();
 		findItem(item);
 		return this;
 	}
 public Batch btnSearch()
 	{
 		btnSearch.click();
		return new Batch(driver);
 	}
 public  Batch clickRandomElementInTable()
 	{
 driver.findElement(By.xpath("//div[@id='grdOffResult']/table/tbody/tr["+ getRandomInt(15) +"]/td[11]/input")).click();
 	return new  Batch(driver);
 	}

 public UpdateReq clickbtnContinue()
 	{
 btnContinue.click();
 		return new UpdateReq(driver);
	}

Появляется ошибка

    java.lang.NullPointerException
    java.lang.NullPointerException 
    at Project.Batch.clickRandomElementInTable(Batch.java:76)

Причем если не использовать цепочки, то все работает хорошо

     batch.inStatusDropdownSelectItem("Not Started");
     batch.btnSearch();
     batch.clickRandomElementInTable();
     batch.clickbtnContinue();

Посоветуйте как избежать ошибки java.lang.NullPointerException и какие есть особенности при работе с цепочками методов?


(Sergey Korol) #2

Первым советом будет внимательное прочтение FAQ. :wink: Раз уж вы только зарегистрировались, будьте добры соблюдать правила форума и не клонировать темы. Ваша предыдущая не просто так была сокрыта. Ввиду того, что 3 личных сообщения были проигнорированы, модераторы имеют полное право удалить тему без объяснений. На первый раз ограничимся предупреждением. Клон будет удален.


(Имя Фамилия) #3

У меня получилосЬ?


(Sergey Korol) #4

Выглядит намного лучше :wink:


(sidelnikovmike) #5

А у вас соучаем там где findElement - driver не null?


(Sergey Korol) #6

Покажите, как вы драйвер храните / передаете по пейджам. Скорее всего где-то теряется связь с объектом, потому и вылетает NPE.


(Имя Фамилия) #7

я нигде драйвер дополнительно не храню(


(sidelnikovmike) #8

строчка 76 класа Batch - можете ее прислать?


(Sergey Korol) #9

Вот, посмотрите пример использования PageObject pattern от @vmaximv
Обратите внимание на BasePage класс.


(Имя Фамилия) #10
driver.findElement(By.xpath("//div[@id='grdOffResult']/table/tbody/tr["+ getRandomInt(15) +"]/td[11]/input")).click();
public int getRandomInt(int max){
	    return (int)(Math.random()*(max-1)+1);
	}

(sidelnikovmike) #11

дебагером смотрели?
driver у Вас похоже null


(Имя Фамилия) #12

мой еклипс зависает при дебаге((


(Имя Фамилия) #13

Вы правы, драйвер - null


(sidelnikovmike) #14

Ну вот.
Вам нужно получше продумать хранение инстанса driver. Чтобы он случайно не обнулялся


(Taras) #15

Ето пейдж обжекти или просто цепочний поиск елементов ?


(Имя Фамилия) #16

вы не подкажите наглядные примеры как хранить драйвер?


(Имя Фамилия) #17

Page Object


(sidelnikovmike) #18

@ArtOfLife в одной из недавних тем рассказывал, как лучше строить хранение.
Сергей, не подскажешь , где?


(Sergey Korol) #19

Подскажу, час назад в текущей теме линк мелькал же :smile:
Более обобщенно из недавних только эта тема была.


(Taras) #20

в цепочних методах пейдж обджекта (тоесть если результатом перехода метода есть инстанс другого пейдж обджекта, например loginToHomePage() возвразает HomePage) Вам нужно на return new HomePage лупить, ну или PageFactory.initElements если Ви его используете. Я вижу с кода что Ви так и делаете, по етому думаю у вас просто webdriver неправально засетан. Как правило webdriver возвращаеться singleton фабрикой, ну конечно если у вас не grid тести