Selenium WebDriver UI對象庫

UI對象庫:使用配置文件存儲測試頁面上的定位和定位表達式,作到定位數據和程序的分離。css

第一步:實現工具類Object工具類,供測試程序調用。java

/**
 * 使用配置文件存儲測試頁面上的定位和定位表達式,作到定位數據和程序的分離
 */
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import org.openqa.selenium.By;

public class ObjectMap {

    Properties properties;

    public ObjectMap(String propFile) {
        properties = new Properties();
        try {
            FileInputStream in = new FileInputStream(propFile);
            properties.load(in);
            in.close();
        } catch (IOException e) {
            System.out.println("讀取對象文件出錯");
            e.printStackTrace();
        }
    }

    public By getLocator(String ElementNameInpopFile) throws Exception {
        // 根據變量ElementNameInpopFile,從屬性配置文件中讀取對應的配置對象
        String locator = properties.getProperty(ElementNameInpopFile);
        
        // 將配置對象中的定位類型存儲到locatorType變量,將定位表達式的值存儲到locatorValue變量中
        String locatorType = locator.split(":")[0];
        String locatorValue = locator.split(":")[1];
        
        // 在Eclipse中的配置文件均默認爲ISO-8859-1編碼存儲,使用getBytes方法能夠將字符串編碼轉換爲UTF-8編碼,以此來解決在配置文件讀取中文亂碼的問題
        locatorValue = new String(locatorValue.getBytes("ISO-8859-1"), "UTF-8");
        // 輸出locatorType變量值和locatorValue變量值,驗證是否賦值正確
        System.out.println("獲取的定位類型:" + locatorType + "\t 獲取的定位表達式:" + locatorValue);
        
        // 根據locatorType的變量值內容判斷返回何種定位方式的By對象
        if (locatorType.toLowerCase().equals("id")) {
            return By.id(locatorValue);
        } else if (locatorType.toLowerCase().equals("name")) {
            return By.name(locatorValue);
        } else if ((locatorType.toLowerCase().equals("classname")) || (locatorType.toLowerCase().equals("class"))) {
            return By.className(locatorValue);
        } else if ((locatorType.toLowerCase().equals("tagname")) || (locatorType.toLowerCase().equals("tag"))) {
            return By.className(locatorValue);
        } else if ((locatorType.toLowerCase().equals("linktext")) || (locatorType.toLowerCase().equals("link"))) {
            return By.linkText(locatorValue);
        } else if (locatorType.toLowerCase().equals("partiallinktext")) {
            return By.partialLinkText(locatorValue);
        } else if ((locatorType.toLowerCase().equals("cssselector")) || (locatorType.toLowerCase().equals("css"))) {
            return By.cssSelector(locatorValue);
        } else if (locatorType.toLowerCase().equals("xpath")) {
            return By.xpath(locatorValue);
        } else {
            throw new Exception("輸入的 locator type 未在程序中被定義:" + locatorType);
        }
    }
}

 

 第二步:對要測試的網頁進行分析,把須要定位的元素的定位表達式存放在配置文件中(此處爲ObjectMap.properties)web

QQ.Login.frame=id:switcher_plogin
QQ.Email.username=id:u
QQ.Email.password=id:p
QQ.Email.login_button=id:login_buttonchrome

 

第三步:編寫測試類工具

/**
 * 實現程序與數據的分離,主要分爲3步:
 * 1.從UI對象庫文件ObjectMap.properties文件取得測試頁面須要操做的頁面元素的定位方式和定位表達式
 * 2.從ObjectMap類取得該頁面元素的實例對象
 * 3.返回給測試用例方法中,進行後續處理
 */
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class ObjectMapTest {
    private WebDriver driver;
    private ObjectMap objectMap;
    String url;
    
    @BeforeMethod
    public void beforeMethod(){
        url="https://en.mail.qq.com";
        System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    
    @AfterMethod
    public void afterMethod(){
        driver.quit();
    }
    
    @Test
    public void test(){
        driver.get(url);
        //設置10秒超時時間
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        try {
            //聲明一個objectMap對象,參數是ObjectMap.properties的絕對路徑
            objectMap = new ObjectMap("F:\\workspace\\TestNGProj\\ObjectMap.properties");
            
            driver.switchTo().frame("login_frame");
            //調用objectMap實例的getLocator方法
            WebElement frame = driver.findElement(objectMap.getLocator("QQ.Login.frame"));
            WebElement username = driver.findElement(objectMap.getLocator("QQ.Email.username"));
            WebElement password = driver.findElement(objectMap.getLocator("QQ.Email.password"));
            WebElement button = driver.findElement(objectMap.getLocator("QQ.Email.login_button"));

            frame.click();
            username.sendKeys("xxxx@qq.com");
            password.sendKeys("xxxx");
            button.click();
            Thread.sleep(3000);
            //斷言頁面上是否顯示了Sign out字符
            Assert.assertTrue(driver.getPageSource().contains("Sign out"));

        } catch (Exception e) {
            System.out.println("生成object對象失敗");
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索