2 Belangrijke ontwerppatronen en best practices voor selenium

In deze tutorial zullen we leren over Selenium-ontwerppatronen en best practices tijdens het werken met Selenium Automation framework-ontwikkeling (hybride framework in selenium), er zijn twee varianten van Framework Design of Framework-model die we moeten overwegen, namelijk: 

We moeten weten en begrijpen waarom een ​​taalontwerppatroon vereist is bij het ontwikkelen van onze kader in een van de Selenium kadermodel. We raden u aan om de vorige segmenten van de door te nemen Selenium Framework ontwikkeling tutorial serie om het hele begrip te krijgen.

Laten we dat in detail begrijpen: 

selenium ontwerppatronen en best practices -hybride raamwerk in selenium

Bij het ontwerpen van een Framework, moeten we rekening houden met enkele ontwerparchitectuur, dwz seleniumontwerppatronen en best practices, en volgens de behoefte van het type framework-model moeten we een taal selecteren Ontwerp patroon om de probleemstatus van het raamwerkontwerp als geheel op te lossen.

Daarom, om af te sluiten, kunnen we kiezen voor een Selenium-raamwerkmodel (Hybrid, Pagina-objectmodel, Data Driven, etc.), maar om het model te implementeren, moeten we een taalontwerppatroon volgen en implementeren (bijvoorbeeld java/C# ontwerppatronen) 

Waarom we een seleniumontwerppatroon en best practices nodig hebben bij het bouwen van Selenium Framework: 

Welke ontwerppatronen moeten worden gebruikt in Selenium Framework: 

Er zijn een paar ontwerppatronen die u zou kunnen gebruiken om verschillende delen van het framework te implementeren, zoals een voorbeeld: 

We zullen de live coderingssjabloon van het hele Framework in de komende berichten hier doen.

Singleton Design Pattern voor hybride framework in Selenium: 

Singleton Design Pattern is een patroon waarin u slechts één object uit een klasse kunt maken en hetzelfde object kunt gebruiken om toegang te krijgen tot de methoden van de klasse; we zouden het ontwerppatroon in de configurator kunnen gebruiken, waar we alleen de configuratiegegevens hoeven te lezen en in een gegevensopslag kunnen laden (elke soort datastructuur die je zou kunnen gebruiken als en wanneer nodig tijdens de uitvoering van alle klassen en methoden) 

Dus we kunnen hetzelfde bereiken op de onderstaande manier terwijl we hetzelfde ontwerpen met het Singleton Design-patroon. 

OPMERKING: We zullen het raamwerk helemaal opnieuw ontwerpen en ontwikkelen in de komende sectie van de tutorialserie, maar deze specifieke tutorial zal je inzicht geven in de noodzaak van het ontwerppatroon.

pakket com.cyborg.core.generic.dataUtils; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; java.io.InputStream importeren; import java.util.LinkedHashMap; import java.util.Eigenschappen; import java.util.Set; import org.apache.log4j.PropertyConfigurator; // Dit is de SingleTon Class openbare klasse PropertiesDataUtils { private Properties properties = null; openbare statische LinkedHashMap configDataStore = nieuwe LinkedHashMap (); InputStream is = null; // Dit is de statische en privé-referentie van de klasse die u overal in uw raamwerk privé-statisch zou kunnen gebruiken PropertiesDataUtils propertiesDataUtils = null; boolean centralizeLog = false; // Dit is de Private constructor om het object te maken, maar je hebt hier geen toegang toe van buiten de klasse om het ontwerp van het SingleTon-patroon te behouden, dat wil zeggen dat er slechts één object wordt gemaakt.
 private PropertiesDataUtils (String filePath) { generationDataStore (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() {} // Deze methode maakt in feite de instantie van de SingleTon class public static PropertiesDataUtils getInstance(String filePath) {if (propertiesDataUtils == null) propertiesDataUtils = new PropertiesDataUtils(filePath); return propertiesDataUtils; } // deze methode creëert in feite de datastore waar u alle configuratiegegevens wilt opslaan, zoals eerder besproken private void generationDataStore (String filePath) { try { this.properties = new Properties (); is=nieuwe FileInputStream(filePath); eigenschappen.belasting(is); overrideFromEnvironment(); Set sleutels = loadAllKeys(); for (Object k : keys) { String key = (String) k; configDataStore.put(sleutel, getPropertyValue(sleutel)); } } catch (FileNotFoundException fileNotFoundException) { String exceptionData = String.valueOf(fileNotFoundException.getCause().getMessage()); } catch (IOException ioException) { String exceptionData = String.valueOf(ioException.getCause().getMessage()); } eindelijk { if (null != is) { probeer { is.close(); } catch (Uitzondering e) { String exceptionData = String.valueOf(e.getCause().getMessage()); } } } } // Deze methode wordt gebruikt om alle sleutels uit het eigenschappenbestand te laden.

Door deze benadering kunnen we het Singleton-ontwerppatroon gebruiken en in ons framework gebruiken.

Fabrieksontwerppatroon in Selenium Framework: 

In het fabrieksontwerppatroon maken we een klasse (we noemen het een fabrieksklasse), en aan de andere kant hebben we er een interface en uiteindelijk geïmplementeerd door "n" aantal klassen.

De fabrieksklasse retourneert in feite het object van de bovenstaande klassen (afhankelijk van de behoefte), zodat u niet met het bovenstaande hoeft om te gaan "N" aantal klassenobject; in plaats daarvan kunt u één object van de Factory-klasse maken en de methode van de factory-klasse aanroepen die het benodigde basislijnobject retourneert voor de vereiste klassen onder de Adobe “n” -klassen.

Dit ontwerp kunt u nu overwegen bij het maken van de verschillende Webdriver / browser-implementatie. 

We hebben een verschillende browser en de implementatie met een ander type Selenium driver (bijv. LocalDriver, RemoteDriver, ThreadDriver, etc.) en als en wanneer u een specifiek type stuurprogramma en een specifiek type browser nodig heeft, kunt u dit in het configuratiebestand vermelden en op basis van de behoefte zal de fabrieksklasse u de instantie van het stuurprogramma en de browser voor uw automatiseringsscript om verder te gebruiken. 

Hier is de codebasis voor het implementeren van dit ontwerppatroon tijdens het creëren van driver-browser-interacties: 

Interface ontwerp : 

pakket com.cyborg.core.web.utils.driverUtils; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.RemoteWebDriver; openbare interface IDriver { openbare WebDriver init (String browserName); }

"N" aantal implementatie van bladerklassen (die de interface implementeren):

pakket com.cyborg.core.web.utils.driverUtils;
importeer org.openqa.selenium.WebDriver;
importeer org.openqa.selenium.chrome.ChromeDriver;
importeer org.openqa.selenium.edge.EdgeDriver;
importeer org.openqa.selenium.firefox.FirefoxDriver;
importeer org.openqa.selenium.ie.InternetExplorerDriver;
importeer org.openqa.selenium.safari.SafariDriver;
public class LocalDriver implementeert IDriver {
   public WebDriver init(String browsernaam) {
       String pathToDriver = getDriverPath(browsernaam);
       if (null != browsernaam) {
           schakelaar (browsernaam) {
               geval "chroom":
                   System.setProperty("webdriver.chrome.driver",
                           padnaarstuurprogramma);
                   retourneer nieuwe ChromeDriver();
               geval "firefox":
                   System.setProperty("webdriver.gecko.driver", pathToDriver);
                   retourneer nieuwe FirefoxDriver();
               standaard:
                   System.setProperty("webdriver.chrome.driver", pathToDriver);
                   retourneer nieuwe ChromeDriver();
           }
       } anders {
           System.setProperty("webdriver.chrome.driver",
                   padnaarstuurprogramma);
           retourneer nieuwe ChromeDriver();
       }
   }
   private String getDriverPath(String browsernaam) {
       Tekenreeks osData = System.getProperty("os.name").toLowerCase().split("\\\\s"[0];
       als (null!= osData) {
           if (osData.equalsIgnoreCase("mac")) {
               return "./DriversExe/" + osData + "_" + browsernaam;
           } else if (osData.contains("nux") || (osData.contains("nix"))) {
               return "./DriversExe/linux_" + browsernaam;
           } else if (osData.contains("win")) {
               return "./DriversExe/" + osData + "_" + browsernaam + ".exe";
           }
       }
       retourneer nul;
   }
}

Hier is de implementatie van de Remote Driver-klasse: 

pakket com.cyborg.core.web.utils.driverUtils; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import com.cyborg.core.generic.dataUtils.PropertiesDataUtils; import java.net.MalformedURLE Exception; java.net.URL importeren; openbare klasse RemoteDriver implementeert IDriver {DesiredCapabilities caps; String remoteHuburl=PropertiesDataUtils.configDataStore.get("WEB_GRID_IP"); @Override public WebDriver init (String browserName) { if (browserName != null) { switch (browserName) { case "firefox": probeer {retourneer nieuwe RemoteWebDriver (nieuwe URL (remoteHuburl), caps.firefox()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace(); } case "chrome": probeer { return new RemoteWebDriver(nieuwe URL(remoteHuburl), caps.chrome()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace(); } case "ie": probeer { return new RemoteWebDriver(nieuwe URL(remoteHuburl), caps.internetExplorer()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace(); } standaard: probeer { retourneer nieuwe RemoteWebDriver (nieuwe URL (remoteHuburl), caps.chrome ()); } catch (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace(); } } retourneert null; } else { retourneer null; } }

Hier is de implementatie van de Factory-klasse, die het respectieve browser- en driverklasseobject biedt: 

pakket com.cyborg.core.web.utils.driverUtils; public class DriverProvider {public IDriver getDriver(String typeOfDriver) {if (typeOfDriver!= null) {switch (typeOfDriver) {case "local": retourneer nieuwe LocalDriver(); case "remote": retourneer nieuwe RemoteDriver(); standaard: retourneer nieuwe LocalDriver(); } } else { return null; } } }

Evenzo kunt u het appium stuurprogramma samen met hetzelfde ontwerp, geef gewoon de implementatie op en declareer een methode in de IDriver-interfaces. 

Conclusie: Hiermee concluderen we hier hoe u taalontwerppatronen kunt gebruiken als onderdeel van de Selenium-ontwerppatronen en best practices terwijl u het hybride raamwerk in Selenium ontwikkelt; in de komende delen van de tutorial zullen we het Page Object model framework voor Selenium Automation bouwen.

Om het te krijgen Algemene tutorial over Selenium, je kunt hier bezoeken

Laat een bericht achter