Member 14178290 Ответов: 2

Получение исключения нулевого указателя при попытке запуска двух классов для двух страниц (страница входа и домашняя страница)


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


package Utilities;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Browserfctry {

	public static WebDriver startApplication(WebDriver dr, String browsername, String url)

	{
		if (browsername.equals("chrome")) {
			System.setProperty("webdriver.chrome.driver", "/home/ibrahim/eclipse-workspace/chromedriver");
			dr = new ChromeDriver();
		} else if (browsername.equals("firefox")) {
			System.setProperty("webdriver.gecko.driver", "/home/ibrahim/eclipse-workspace/geckodriver");
			dr = new FirefoxDriver();
		} else {
			System.out.println("we do not support this browser");
		}
		dr.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
		dr.manage().window().maximize();
		dr.get(url);
		dr.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		return dr;

	}

//	public static void quitbrowser(WebDriver dr)
//	{
//	dr.quit();
//	
}


Что я уже пробовал:

Мой базовый класс:
package Pages;

import org.openqa.selenium.WebDriver;
import org.testng.annotations.BeforeSuite;

import Utilities.Browserfctry;

public class BaseClass {
	public WebDriver dr;

	@BeforeSuite
	public void start() {
		dr = Browserfctry.startApplication(dr, "chrome", "http://192.168.11.92:3003");
	}

//@AfterClass
//	public void terminate()
//	{
//		Browserfctry.quitbrowser(dr);
//		
//	}
}


Моя домашняя страница класс

package Pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

public class HomePageTR {
	WebDriver driver;

	public HomePageTR(WebDriver dr) {
		this.driver = dr;
	}

	@FindBy(xpath = "//span[@class='glyphicon glyphicon-th']")
	WebElement Homemenuicon;

	@FindBy(xpath = "//span[@class='glyphicon glyphicon-user']")
	WebElement Profileicon;

	@FindBy(xpath = "//span[@class='glyphicon glyphicon-cog']")
	WebElement Settingsicon;

	@FindBy(xpath = "//span[@class='glyphicon glyphicon-off']")
	WebElement Logouticon;

	@FindBy(xpath = "//span[@class='glyphicon glyphicon-menu-left']")
	WebElement Sidemenucollider;

	@FindBy(xpath = "//li[@data-section='dataset']")
	WebElement SDMDataAccessicon;

	@FindBy(xpath = "//li[@data-section='metadataWizard']")
	WebElement SDMMetadataicon;

	@FindBy(xpath = "//li[@data-section='analysisWizard']")
	WebElement SDMMotifexplorericon;

	@FindBy(xpath = "(//img)[@src='/images/home/library.png'][1]")
	WebElement SDMMotiflibrary;

	@FindBy(xpath = "//li[@data-section='dashboardSelect']")
	WebElement SDMDashboards;

	@FindBy(xpath = "//a[@data-section='dataset']")
	WebElement Dataaccessicon;

	@FindBy(xpath = "//a[@data-section='metadataWizard']")
	WebElement Metadataicon;

	@FindBy(xpath = "//a[@data-section='analysisWizard']")
	WebElement Motifexplorericon;

	@FindBy(xpath = "//a[@data-section='browser']")
	WebElement Motiflibraryicon;

	@FindBy(xpath = "//a[@data-section='dashboardSelect']")
	WebElement Dashboardicon;

//nextpage reference objects

	@FindBy(xpath = "//a[@data-name='dataAccess']")
	WebElement dataaccesrfrnc;

	@FindBy(xpath = "//div[@class='main-menu-logo']")
	WebElement Logo;

	@FindBy(xpath = "//div[@class='row icon-row']")
	WebElement d1;

	public String dataiconchk() throws InterruptedException {
		Thread.sleep(3000);

		System.out.println(d1.isDisplayed());
		System.out.println(Dataaccessicon.isDisplayed());
		System.out.println("dataicon reached");
		Dataaccessicon.click();
		System.out.println("datacliked");
		String chumma = dataaccesrfrnc.getText();
		return chumma;

	}

}


Тестовый пример моей домашней страницы

package Testcases;

import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
import org.testng.annotations.Test;

import Pages.BaseClass;
import Pages.HomePageTR;

public class HomePageTestTR extends BaseClass {
	HomePageTR homepagetr;

	@Test(priority = 6)
	public void dataiconchk() throws InterruptedException {

		homepagetr = PageFactory.initElements(dr, HomePageTR.class);
		String dataaccessheader = homepagetr.dataiconchk();

		Assert.assertEquals(dataaccessheader, "Data Access");

		System.out.println("data acces icon checked");

	}

}


Моя ошибка:

dataiconchk
java.lang.NullPointerException
	at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
	at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
	at com.sun.proxy.$Proxy8.isDisplayed(Unknown Source)
	at Pages.HomePageTR.dataiconchk(HomePageTR.java:77)
	at Testcases.HomePageTestTR.dataiconchk(HomePageTestTR.java:18)
... Removed 25 stack frames

Richard MacCutchan

Вам нужно проследить назад через трассировку стека, чтобы найти, где в вашем коде находится вызов, который привел к исключению. Затем вы должны быть в состоянии определить, какая переменная является нулевой.

Gerry Schmitz

Нужно ли вам поддерживать ссылку на "каждый класс, который вы запускаете"? Или это "зажги и забудь"?

2 Ответов

Рейтинг:
12

Richard MacCutchan

homepagetr = PageFactory.initElements(dr, HomePageTR.class);
String dataaccessheader = homepagetr.dataiconchk();

При грубом предположении один из вышеперечисленных методов не возвращает действительную ссылку. Что-то, что ваш код не может проверить.


Рейтинг:
1

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - запустить свою программу в отладчике, и когда она выйдет из строя, отладчик покажет вам строку, на которой он обнаружил проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз он остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!