t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

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

          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 и какие есть особенности при работе с цепочками методов?

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

1 Симпатия

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

1 Симпатия

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

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

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

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

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

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

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);
	}

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

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

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

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

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

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

Page Object

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

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

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