Ogólna metoda tworząca obiekt klasy

0

witam,
jestem świerzak, więc proszę o wyrozumiałość. Jave i oop znam bardzo średnio. Zacząłem się bawić trochę selenium webdriver. Mam lekki problem, zapewne to podstawy.
Mam klasy - w których mam wypisane lokatory do elementów stron oraz metody które są wynkonywane na tych lokalizatorach (click(), sendkeys()) itp:
HomePage
LoginPage
itd
Główna klasa w której będą wywoływane metody to:
AddNewLeadTest.

Teraz robię tak że aby wywołać jakąś metodę z np HomePage muszę napisać coś takiego

HomePage hp = new HomePage(driver);
hp.loginButton.click()

O co mi ogólnie chodzi? Czy i jak mogę napisać klasę/metodę "ogólną" dzięki której mógłbym wywoływać medoty z klas z lokatorami w prostszy sposób, np
HomePage.loginButton.click()

bez tworzenia nowego obiektu dla każdej z klas (HomePage,LoginPage ....)

Chodziło by mi dokładnie o coś takiego (to jest przykład z neta, napisany w C#), tylko nie wiem jak to powinno wyglądać w javie i czy by to w ogóle działało

 private static T GetPage<T>() where T : new()
        {
            var page = new T();
            PageFactory.InitElements(Browser.Driver, page);
            return page;
        }

        public static AboutPage About
        {
            get { return GetPage<AboutPage>(); }
        }

        public static TopNavigationPage TopNavigation
        {
            get { return GetPage<TopNavigationPage>(); }
        }

        public static HomePage Home
        {
            get { return GetPage<HomePage>(); }
        }

        public static ContactPage Contact
        {
            get { return GetPage<ContactPage>(); }
        }

        public static RegisterPage Register
        {
            get { return GetPage<RegisterPage>(); }
        }

        public static LoginPage Login
        {
            get { return GetPage<LoginPage>(); }
        }

        public static ManageAccountPage ManageAccount
        {
            get { return GetPage<ManageAccountPage>(); }
        }
0

loginButton ma być static.
Po prostu przed polem, tam gdzie masz np. public int a = 5; zmień na public static int a = 5;.

Tylko zastanów się dobrze, czy na pewno tego chcesz - static używa się przed tymi zmiennymi/metodami, które nie są związane z danym obiektem, a raczej: są wspólne dla wszystkich obiektów.

Dla przykładu:

public class JakasKlasa {
	public int id1 = 0;
	public static int id2 = 0;
}

public class Start {
	public static void main(String[] args) {
		JakasKlasa a = new JakasKlasa();
		JakasKlasa b = new JakasKlasa();
		
		a.id1++;
		System.out.println(a.id1); //wyświetli 1
		System.out.println(b.id1); //wyświetli 0
		
		a.id2++; //id2 jest static, wspólne dla wszystkich obiektów klasy JakasKlasa
		//dlatego równie dobrze możesz napisać:
		JakasKlasa.id2++;
		//zwiększenie w ten sposób id1 nie zadziała, bo ona nie jest static, więc może być różna dla każdego obiektu
		System.out.println(a.id2); //wyświetli 2
		System.out.println(b.id2); //też wyświetli 2
	}
}
0

Nie do końca się chyba rozumiemy, to co jest w poście pod koniec to jest przykład z neta testu. Postaram się opisać to prościej.
obecnie w klasie HomePage mam metode:
która po wywołaniu przenosi do formularza logowania

gotoLoginPage(){
loginButton.click()
}

W klasie która ma przeprowadzić test(AddNewLeadTest) wywołuję tą metodę tak:

HomePage hp = new HomePage(driver)
hp.gotoLoginPage();
}

Znalazłem przykład w necie, gdzie gościu by wywołał w moim wypadku w klasie AddNewLeadTest, tą metodę w sposób

public void CanGoToLoginPage()
        {
            Pages.Home.Goto();
        }

używając klasy Pages w ten sposób

 public static class Pages
    {
        private static T GetPage<T>() where T : new()
        {
            var page = new T();
            PageFactory.InitElements(Browser.Driver, page);
            return page;
        }

      **  public static LoginPage Login
        {
            get { return GetPage<LoginPage>(); }
        }**



        public static AboutPage About
        {
            get { return GetPage<AboutPage>(); }
        }

        public static TopNavigationPage TopNavigation
        {
            get { return GetPage<TopNavigationPage>(); }
        }
...
    
    }

I chodzi mi teraz, jak napisać w javie klase typu Pages

tutaj jest jeszcze klasa LoginPages z przykladu

   public class LoginPage
    {

        public void Goto()
        {
            Pages.TopNavigation.LogIn();
        }
    }

oraz TopNavigation

      [FindsBy(How = How.LinkText, Using = "Log in")]
        private IWebElement logInLink;


 public void LogIn()
        {
            logInLink.Click();
        }

 
0

prosta sprawa czy da się coś takiego napisać w javie? Czy private static T GetPage<T>() where T : new() nie jest związanie z typami generycznymi w javie??
Jeśli tak to prosił bym o podpowiedź jak to zamienić na jave

private static T GetPage<T>() where T : new()
        {
            var page = new T();
            PageFactory.InitElements(Browser.Driver, page); (to nie jest ważne bo to selenium)
            return page;
        }
 
        public static AboutPage About
        {
            get { return GetPage<AboutPage>(); }
        }
0

Tak, tu są typy generyczne, ale ni kija nie mam pojęcia, o co ci w końcu chodzi.

0

OK to tak, jak zapisać w javie to

 private static T GetPage<T>() where T : new()
var page = new T();

i to:
get { return GetPage<AboutPage>(); }

nic więcej nie potrzebuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1