1. 程式人生 > >自動化測試--封裝getDriver的方法

自動化測試--封裝getDriver的方法

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的方法