Trong kiểm thử tự động, việc đóng gói các chức năng thường dùng giúp tăng tính tái sử dụng.
Bài viết này trình bày cách triển khai phương thức khởi tạo trình duyệt.
Phiên bản đầu tiên sử dụng truyền tham số:
@Parameters(value = {"browserType","driverPath","firefoxInstallPath","firefoxVersion"})
public void initializeDriver(String browserType, String driverPath, String firefoxInstallPath, String firefoxVersion) {
if (browserType.equals("ie")) {
driver = createIEDriver(driverPath);
} else if (browserType.equals("chrome")) {
driver = createChromeDriver(driverPath);
} else if (browserType.equals("firefox")) {
driver = createFirefoxDriver(driverPath, firefoxInstallPath, firefoxVersion);
}
}
private WebDriver createFirefoxDriver(String driverPath, String firefoxInstallPath, String firefoxVersion) {
System.setProperty(SystemProperty.BROWSER_BINARY, firefoxInstallPath);
if ("3.X".equals(firefoxVersion)) {
System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, driverPath);
}
return new FirefoxDriver();
}
private WebDriver createChromeDriver(String driverPath) {
System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, driverPath);
return new ChromeDriver();
}
private WebDriver createIEDriver(String driverPath) {
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, driverPath);
return new InternetExplorerDriver(capabilities);
}
File cấu hình TestNG sẽ trở nên phức tạp hơn khi cần thay đổi từng tham số. Để cải thiện, phương pháp mới sử dụng đọc file cấu hình và phản xạ để điều khiển trình duyệt.
Các bước triển khai:
- Chuẩn bị file cấu hình XML:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Chỉ cần thay đổi browserIndex để chọn trình duyệt tương ứng -->
<browser browserIndex="3">
<!-- Cấu hình Chrome -->
<config class="org.openqa.selenium.chrome.ChromeDriver" index="0">
<properties>
<property
name="ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY"
value="E:/driver/chromedriver.exe" />
</properties>
</config>
<!-- Cấu hình Firefox cho Selenium 3.x -->
<config class="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>
</config>
<!-- Cấu hình Firefox cho Selenium 2.x -->
<config class="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>
</config>
<!-- Cấu hình IE -->
<config class="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>
</config>
</browser>
Code thực hiện:
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 DriverFactory {
private static Class<?> clazz;
private static Object instance;
public static void mainTest(String[] args) throws InterruptedException {
WebDriver driver = createDriver();
driver.get("http://www.baidu.com");
Thread.sleep(10000);
driver.quit();
}
public static WebDriver createDriver() {
Document document = null;
Element configElement= null;
String className =null;
SAXReader reader = new SAXReader();
try {
document = reader.read(DriverFactory.class.getResourceAsStream("/browserConfig.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
/**
* Xử lý XML để lấy tên lớp trình duyệt
*/
Element rootElement = document.getRootElement(); // Lấy nút gốc
int index = Integer.parseInt(rootElement.attributeValue("browserIndex"));// Lấy giá trị index
// Duyệt danh sách cấu hình để tìm đúng index
List<Element> configElements = rootElement.elements("config");
for (Element config : configElements) {
int i = Integer.parseInt(config.attributeValue("index"));
if (i == index) {
className = config.attributeValue("class");// Lấy tên lớp
configElement = config;// Lưu nút cấu hình
}
}
/**
* Khởi tạo lớp trình duyệt bằng phản xạ
*/
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
/**
* Xử lý thuộc tính hệ thống và khả năng trình duyệt
*/
Element propsElement = configElement.element("properties");
List<Element> propElements = propsElement.elements("property");
// Thiết lập thuộc tính hệ thống
for (Element prop : propElements) {
System.setProperty(prop.attributeValue("name"), prop.attributeValue("value"));
}
// Thiết lập khả năng (đối với IE cần cài đặt các tùy chọn đặc biệt)
Element capsElement = configElement.element("capabilities");
if (capsElement != null) {
// Tạo đối tượng khả năng
DesiredCapabilities capabilities = new DesiredCapabilities();
// Lấy danh sách khả năng
List<Element> capElements = capsElement.elements("capability");
for (Element cap : capElements) {
// Gán giá trị cho khả năng
capabilities.setCapability(cap.attributeValue("name"), true);
}
}
/*
* Tạo đối tượng trình duyệt thông qua phản xạ
*/
try {
instance = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
WebDriver driver = (WebDriver) instance;
return driver;
}
}
Chỉ cần thay đổi giá trị browserIndex trong file cấu hình để khởi động trình duyệt tương ứng.