自動化測試--封裝getDriver的方法
阿新 • • 發佈:2018-08-11
internet void 瀏覽器類型 [] inf 忽略 ret pac true
在自動化測試的時候,通常都會把最常用的功能封裝起來,實現通用性。
該篇博客是實現了getDriver方法的封裝。
第一次封裝的時候,是使用的傳參。
@Parameters(value = {"driverType","dirvePath","fireFoxInstallPath","fireFoxVersion"}) public void getDriver(String driverType, String dirvePath, String fireFoxInstallPath, String fireFoxVersion) { if (driverType.equals("ie")) { driver= getIEDriver(dirvePath); } else if (driverType.equals("chrome")) { driver = getChromeDriver(dirvePath); } else if (driverType.equals("fireFox")) { driver = getFireFoxDriver(dirvePath, fireFoxInstallPath, fireFoxVersion); } }private WebDriver getFireFoxDriver(String dirvePath, String fireFoxInstallPath, String fireFoxVersion) { System.setProperty(SystemProperty.BROWSER_BINARY, fireFoxInstallPath); if ("3.X".equals(fireFoxVersion)) { System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, dirvePath); }return new FirefoxDriver(); } private WebDriver getChromeDriver(String dirvePath) { System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, dirvePath); return new ChromeDriver(); } private WebDriver getIEDriver(String dirvePath) { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true); capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); System.setProperty(InternetExplorerDriverService.IE_DRIVER_EXE_PROPERTY, dirvePath); return new InternetExplorerDriver(capabilities); }
下面是testNG 的配置文件:
可以看到,這種實現方式,會使我們的配置文件變得比較龐大,不夠清晰。每次切換 啟動的瀏覽器類型的時候,要一項項修改配置文件,比較麻煩。
考慮到上述缺點,筆者重新換了實現方式。使用讀取配置文件、反射的方法來切換瀏覽器的啟動。
下面是實現方法:
1.準備配置文件:
<?xml version="1.0" encoding="UTF-8"?> <!-- 只需要修改下面的driverIndex 就可以去創建對應index的驅動--> <driver driverIndex="3"> <!-- 谷歌瀏覽器配置文件 --> <name value="org.openqa.selenium.chrome.ChromeDriver" index="0"> <properties> <property name="ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY" value="E:/driver/chromedriver.exe" /> </properties> </name> <!-- 火狐瀏覽器 對應的selenium3.x版本 的配置文件 --> <name value="org.openqa.selenium.firefox.FirefoxDriver" seleniumVersion="3.x" index="1"> <properties> <property name="SystemProperty.BROWSER_BINARY" value="C:\Program Files (x86)\Mozilla Firefox\firefox.exe" /> <property name="GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY" value="E:/driver/geckodriver.exe" /> </properties> </name> <!-- 火狐瀏覽器 對應的selenium2.x版本 的配置文件 --> <name value="org.openqa.selenium.firefox.FirefoxDriver" seleniumVersion="2.x" index="2"> <properties> <property name="SystemProperty.BROWSER_BINARY" value="C:\Program Files (x86)\Mozilla Firefox\firefox.exe" /> </properties> </name> <!--IE瀏覽器配置文件 --> <name value="org.openqa.selenium.ie.InternetExplorerDriver" index="3"> <properties> <property name="InternetExplorerDriverService.IE_DRIVER_EXE_PROPERTY" value="E:/driver/IEDriverServer.exe" /> </properties> <capabilities> <capability name="InternetExplorerDriver.IGNORE_ZOOM_SETTING" /> <capability name="InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS" /> </capabilities> </name> </driver>
下面是實現瀏覽器切換的代碼:
package com.claire.jing.utils; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; public class GetDriverUtil { private static Class clazz; private static Object obj ; public static void main(String[] args) throws InterruptedException { WebDriver driver = getDriver(); driver.get("http://www.baidu.com"); Thread.sleep(10000); driver.quit(); } public static WebDriver getDriver() { Document document = null; Element driverNameElement= null; String driverName =null; SAXReader reader = new SAXReader(); try { document = reader.read(GetDriverUtil.class.getResourceAsStream("/driverProperties.xml")); } catch (DocumentException e) { e.printStackTrace(); } /** * 下面是通過解析XML,獲取到驅動的類全名 */ Element rootElement = document.getRootElement(); //獲取到根節點 int index = Integer.parseInt(rootElement.attributeValue("driverIndex"));//獲取到根節點上的driverIndex並轉成int類型 //獲取到所有"name"子節點,遍歷,找出與根節點中的driverIndex相同的,將其value屬性值獲取出來,作為類全名用於反射 List<Element> driverNameElements = rootElement.elements("name"); for (Element driverNameElement1 : driverNameElements) { int i = Integer.parseInt(driverNameElement1.attributeValue("index")); if (i == index) { driverName = driverNameElement1.attributeValue("value");//獲取到name子節點的“value”屬性值 driverNameElement = driverNameElement1;//將該節點賦值給driverElement,後續根據它來獲得子節點 } } /** * 通過類全名,反射出驅動類來 */ try { clazz = Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } /** * 下面是解析XML中的系統參數以及能力參數 */ Element propertiesElement = driverNameElement.element("properties"); List<Element> propertyElements = propertiesElement.elements("property"); //設置系統參數 for (Element property : propertyElements) { System.setProperty(property.attributeValue("name"), property.attributeValue("value")); } //設置能力(ie的話,需要設置忽略域設置等級 以及忽略頁面百分比的能力) Element capabilitiesElement = driverNameElement.element("capabilities"); if (capabilitiesElement != null) { //創建能力對象 DesiredCapabilities realCapabilities = new DesiredCapabilities(); //獲得能力列表 List<Element> capabilitiesElements = capabilitiesElement.elements("capability"); for (Element capability : capabilitiesElements) { //遍歷能力列表,並給能力賦值 realCapabilities.setCapability(capability.attributeValue("name"), true); } } /* * 通過反射,創建驅動對象 */ try { obj = clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } WebDriver driver = (WebDriver) obj; return driver; } }
實現了只要修改配置文件中的driverIndex的值,就能去啟動對應的瀏覽器。
自動化測試--封裝getDriver的方法