2 Ważne wzorce projektowe i najlepsze praktyki Selenium

W tym samouczku dowiemy się o wzorcach projektowych Selenium i najlepszych praktykach podczas pracy z rozwojem frameworka Selenium Automation (framework hybrydowy w selenie), istnieją dwie odmiany Framework Design lub Framework, które musimy wziąć pod uwagę: 

Musimy wiedzieć i rozumieć, dlaczego wzorzec projektowania języka jest wymagany, gdy rozwijamy nasz ramy w jednym z Selenium Model ramowy. Proponujemy przejść przez poprzednie segmenty Seria samouczków programistycznych Selenium Framework aby uzyskać pełne zrozumienie.

Rozumiemy to szczegółowo: 

wzorce projektowe i najlepsze praktyki dotyczące selenu -szkielet hybrydowy w selenie

Projektując dowolny Framework musimy wziąć pod uwagę jakąś architekturę projektową, tj. Wzorce projektowe selenu i najlepsze praktyki, a zgodnie z potrzebą typu modelu frameworkowego musimy wybrać język Wzór rozwiązanie problemu stanu konstrukcji szkieletowej jako całości.

Podsumowując, możemy wybrać model szkieletowy Selenium (Hybrid, Model obiektu strony, Data Driven itp.), ale aby zaimplementować model, musimy przestrzegać i implementować pewne wzorce projektowe języka (np. wzorce projektowe java/C# ) 

Dlaczego potrzebujemy wzorca projektowego selenu i najlepszych praktyk podczas tworzenia Selenium Framework: 

Jakie wzorce projektowe mają być używane w Selenium Framework: 

Istnieje kilka wzorców projektowych, których można użyć do zaimplementowania różnych obszarów frameworka, na przykład: 

Zrobimy szablon kodowania na żywo całego frameworka w nadchodzących postach tutaj.

Wzorzec projektowy Singleton dla platformy hybrydowej w Selenium: 

Singleton Design Pattern to wzorzec, w którym można utworzyć tylko jeden obiekt z klasy i uzyskać dostęp do metod tej klasy przy użyciu tego samego obiektu; moglibyśmy wykorzystać wzorzec projektowy w konfiguratorze, w którym wystarczy odczytać dane konfiguracyjne i możemy załadować do jakiegoś magazynu danych (dowolna struktura danych, której można użyć w razie potrzeby podczas wykonywania z dowolnych klas i metod) 

Mogliśmy więc osiągnąć to samo w poniższy sposób, projektując to samo z wzorcem Singleton Design. 

UWAGA: W następnej części serii samouczków zaprojektujemy i opracujemy framework od podstaw, ale ten konkretny samouczek zapewni ci wgląd w konieczność wzorca projektowego.

pakiet com.cyborg.core.generic.dataUtils; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.LinkedHashMap; import java.util.Properties; import java.util.Set; import org.apache.log4j.PropertyConfigurator; // To jest klasa SingleTon public class PropertiesDataUtils { private Properties properties = null; publiczny statyczny LinkedHashMap configDataStore = nowa LinkedHashMap (); InputStream to = null; // To jest statyczna i prywatna referencja klasy, której można użyć w dowolnym miejscu w strukturze private static PropertiesDataUtils propertiesDataUtils = null; boolean centralizeLog = false; // To jest konstruktor Private do tworzenia obiektu, ale nie możesz uzyskać do niego dostępu spoza klasy, aby zachować projekt wzorca SingleTon, tj. tworzenie tylko jednego obiektu.
 private PropertiesDataUtils(String filePath) { generateDataStore(filePath); centralizeLog = Boolean.parseBoolean(PropertiesDataUtils.configDataStore.get("centralizedLog")); if(centralizeLog) PropertyConfigurator.configure(System.getProperty("user.dir")+"//src//test//resources//config//log4j_central.properties"); else PropertyConfigurator.configure(System.getProperty("user.dir")+"//src//test//resources//config//log4j_local.properties"); } private PropertiesDataUtils() { } // Ta metoda zasadniczo tworzy instancję klasy SingleTon public static PropertiesDataUtils getInstance(String filePath) { if (propertiesDataUtils == null) propertiesDataUtils = new PropertiesDataUtils(filePath); zwróć właściwościDataUtils; } // ta metoda zasadniczo tworzy magazyn danych, w którym chcesz przechowywać wszystkie dane konfiguracyjne, jak omówiono wcześniej private void generateDataStore(String filePath) { try { this.properties = new Properties(); is=new FileInputStream(filePath); properties.load(is); overrideFromEnvironment(); Ustawić klucze = loadAllKeys(); for (Object k : keys) { String key = (String) k; configDataStore.put(klucz, getPropertyValue(klucz)); } } catch (FileNotFoundException fileNotFoundException) { String wyjątekData = String.valueOf(fileNotFoundException.getCause().getMessage()); } catch (IOException ioException) { StringExceptionData = String.valueOf(ioException.getCause().getMessage()); } wreszcie { if (null != is) { spróbuj { is.close(); } catch (Wyjątek e) { String wyjątekData = String.valueOf(e.getCause().getMessage()); } } } } // Ta metoda służy do ładowania wszystkich kluczy z pliku właściwości.

Dzięki temu podejściu moglibyśmy użyć wzorca projektowego Singleton i użyć go w naszym frameworku.

Wzorzec projektowania fabryki w ramach Selenium: 

We wzorcu projektowania fabryki tworzymy klasę (nazywamy ją klasą Factory), az drugiej strony mamy interfejs i ostatecznie zaimplementowane przez „n” liczbę klas.

Klasa fabryczna w zasadzie zwraca obiekt z powyższych klas (w zależności od potrzeby), więc nie musisz się tym zajmować „N” liczba obiektów klas; można raczej utworzyć jeden obiekt klasy Factory i wywołać metodę klasy fabrycznej, która zwraca wymagany obiekt linii bazowej Object dla wymaganych klas spośród klas „n” firmy Adobe.

Teraz ten projekt możesz wziąć pod uwagę podczas tworzenia innej implementacji Webdriver / przeglądarki. 

Mamy różne przeglądarka i implementacja z innym typem Selenium sterownika (np. LocalDriver, RemoteDriver, ThreadDriver, itp.) i kiedy potrzebujesz określonego typu sterownika i określonego typu przeglądarki, możesz wymienić w pliku konfiguracyjnym i na podstawie potrzeby klasa fabryczna zapewni Ci instancję sterownik i przeglądarkę do dalszego wykorzystania przez skrypt automatyzacji. 

Oto podstawa kodu do implementacji tego wzorca projektowego podczas tworzenia interakcji sterownik-przeglądarka: 

Projekt interfejsu : 

pakiet com.cyborg.core.web.utils.driverUtils; importuj org.openqa.selenium.WebDriver; importuj org.openqa.selenium.remote.RemoteWebDriver; publiczny interfejs IDriver { public WebDriver init(String nazwa_przegladarki); }

Liczba implementacji klas przeglądania „N” (które implementują interfejs):

pakiet com.cyborg.core.web.utils.driverUtils;
importuj org.openqa.selenium.WebDriver;
importuj org.openqa.selenium.chrome.ChromeDriver;
importuj org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.safari.SafariDriver;
klasa publiczna LocalDriver implementuje IDriver {
   public WebDriver init(String nazwaprzeglądarki) {
       String pathToDriver = getDriverPath(nazwa przeglądarki);
       if (null != nazwa przeglądarki) {
           przełącznik (nazwa przeglądarki) {
               obudowa „chrom”:
                   System.setProperty("webdriver.chrome.driver",
                           ścieżka do sterownika);
                   zwróć nowy ChromeDriver();
               przypadek „firefoxa”:
                   System.setProperty("webdriver.gecko.driver", pathToDriver);
                   zwróć nowy FirefoxDriver();
               domyślny:
                   System.setProperty("webdriver.chrome.driver", pathToDriver);
                   zwróć nowy ChromeDriver();
           }
       } w przeciwnym razie {
           System.setProperty("webdriver.chrome.driver",
                   ścieżka do sterownika);
           zwróć nowy ChromeDriver();
       }
   }
   prywatny ciąg getDriverPath (ciąg nazwaprzeglądarki) {
       String osData = System.getProperty("nazwa os").toLowerCase().split("\\\\s""[0];
       if (null != osData) {
           if (osData.equalsIgnoreCase("mac")) {
               return „./DriversExe/” + osData + „_” + nazwa przeglądarki;
           } else if (osData.contains("nux") || (osData.contains("nix"))) {
               return „./DriversExe/linux_” + nazwa przeglądarki;
           } else if (osData.contains("wygrana")) {
               zwróć „./DriversExe/” + osData + „_” + nazwa przeglądarki + „.exe”;
           }
       }
       zwróć wartość zerową;
   }
}

Oto implementacja klasy Remote Driver: 

pakiet com.cyborg.core.web.utils.driverUtils; importuj org.openqa.selenium.WebDriver; importuj org.openqa.selenium.remote.DesiredCapabilities; importuj org.openqa.selenium.remote.RemoteWebDriver; importuj com.cyborg.core.generic.dataUtils.PropertiesDataUtils; import java.net.MalformedURLException; importuj java.net.URL; klasa publiczna RemoteDriver implementuje IDriver { DesiredCapabilities caps; Ciąg remoteHuburl=PropertiesDataUtils.configDataStore.get("WEB_GRID_IP"); @Override public WebDriver init(String nazwa_przeglądarki) { if (nazwa_przeglądarki != null) { switch (nazwa_przeglądarki) { case "firefox": try { return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); zniekształconyUrlEx.printStackTrace(); } case "chrome": try { return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); zniekształconyUrlEx.printStackTrace(); } case "ie": try { return new RemoteWebDriver(new URL(remoteHuburl), caps.internetExplorer()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); zniekształconyUrlEx.printStackTrace(); } default: try { return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); zniekształconyUrlEx.printStackTrace(); } } return null; } else { return null; } }

Oto implementacja klasy Factory, która udostępnia odpowiednią przeglądarkę i obiekt klasy sterownika: 

pakiet com.cyborg.core.web.utils.driverUtils; public class DriverProvider { public IDriver getDriver(String typeOfDriver) { if (typeOfDriver != null) { switch (typeOfDriver) { case "local": return new LocalDriver(); case "remote": zwróć nowy RemoteDriver(); domyślnie: zwróć nowy LocalDriver(); } } else { return null; } } }

Podobnie możesz zaimplementować appium wraz z tym samym projektem, wystarczy dostarczyć implementację i zadeklarować metodę w interfejsach IDriver. 

Wnioski: Na tym kończymy tutaj, w jaki sposób można używać wzorców projektowania języka jako części wzorców projektowych Selenium i najlepszych praktyk podczas opracowywania struktury hybrydowej w Selenium; w kolejnych segmentach samouczka zbudujemy szkielet modelu Page Object dla Selenium Automation.

Aby uzyskać Ogólny samouczek dotyczący Selenium, możesz odwiedzić tutaj

Zostaw komentarz