一個簡單的Web UI自動化測試框架Java實現

簡介web

原創文章,轉載請註明出處chrome

這個框架的名字叫OAT,全稱Object-Oriented  Automation Test.這個框架的思想借助於Tellurium框架.他的主要功能是將頁面信息及行爲存儲在Java 對象中,而後在腳本中引用頁面的行爲.自動化程序最終由許多的頁面行爲組成.這個框架默認使用Selenium1驅動,而且能夠經過編程使用其餘驅動,因 爲OAT是面向接口的.編程

 

如下以google home page的demo爲例,介紹這個基於Annoation和反射的框架基本運行原理.框架

 

page對象ide

 

Java代碼  收藏代碼
  1. //存儲頁面URL  
  2. @OatPage("webhp")   
  3. public class GooglePage extends Page{  
  4.     @Element("q") // 搜索輸入框的定位符  
  5.     private TextField textField;  
  6.     @Element("btnG") // 搜索按鈕的定位符  
  7.     private Button searchButton;  
  8.       
  9.     // TextField和Button有共同的祖先類Element  
  10.     public TextField getTextField() {  
  11.         return textField;  
  12.     }  
  13.     public Button getSearchButton() {  
  14.         return searchButton;  
  15.     }  
  16.     //進行一次搜索  
  17.     public void doSearch(String q){  
  18.         this.textField.type(q);  
  19.         this.searchButton.click();  
  20.     }     
  21.   
  22. }  

 TextField和button類測試

 

Java代碼  收藏代碼
  1. // Element子類,有本身獨特的行爲  
  2. public class TextField extends Element {  
  3.       
  4.     public void type(String value) {  
  5.         vendor.type(locator, value);  
  6.     }  
  7.       
  8.     public boolean idEditable(){  
  9.         return vendor.isEditable(locator);        
  10.     }  
  11.       
  12.     public String getValue() {  
  13.         return vendor.getAttribute(locator);  
  14.     }  
  15.   
  16. }  
  17. // 一樣是Element的子類,有本身行爲  
  18. public class Button extends Element {  
  19.       
  20.       
  21.     public void click() {  
  22.         vendor.click(locator);  
  23.     }  
  24.       
  25.     public void clickAndWaitToLoad(Page page){  
  26.         click();  
  27.         page.waitToLoad();  
  28.     }  
  29.       
  30.     public void clickAndWaitToLoad(Page page, long timeout) {  
  31.         click();  
  32.         page.waitToLoad(timeout);  
  33.     }  
  34.       
  35.     public void clickAndWaitToLoad(Element element, long timeout) {  
  36.         click();  
  37.         element.waitToLoad(timeout);  
  38.     }  
  39.       
  40.     public void clickAndWaitToLoad(Element element) {  
  41.         clickAndWaitToLoad(element, ELEMENT_DEFAULT_TIMEOUT);  
  42.     }  
  43.       
  44. }  
 

 

自動化測試腳本代碼this

 

Java代碼  收藏代碼
  1. import junit.framework.Assert;  
  2.   
  3. import org.junit.After;  
  4. import org.junit.Before;  
  5. import org.junit.Test;  
  6.   
  7. import com.thoughtworks.selenium.DefaultSelenium;  
  8. import com.thoughtworks.selenium.Selenium;  
  9.   
  10. public class GoogleSearchTestExample1 {  
  11.       
  12.     private String serverUrl = "localhost";  
  13.     private int serverPort = 4444;  
  14.     private String browserCommand = "googlechrome";  
  15.     private String url = "http://www.google.com.hk";  
  16.       
  17.     private GooglePage page;  
  18.     private GoogleResultPage resultPage;  
  19.     private Selenium selenium;  
  20.     private Oat oat;  
  21.   
  22.     @Before  
  23.     public void setUp() throws Exception {  
  24.         // 初始化selenium  
  25.         selenium = new DefaultSelenium(serverUrl,serverPort,browserCommand, url);  
  26.         // Oat類是框架總的控制器,設置Selenium爲背後的驅動  
  27.         oat = Oat.getInstance(selenium);  
  28.         oat.start();  
  29.         oat.open("/webhp");  
  30.         // 初始化被測試頁面  
  31.         page = (GooglePage) oat.getPage(GooglePage.class);  
  32.         resultPage = (GoogleResultPage) oat.getPage(GoogleResultPage.class);  
  33.   
  34.     }  
  35.       
  36.     @Test  
  37.     public void testSearch() throws InterruptedException {  
  38.         // 在google頁面收入"oat"進行搜索  
  39.                 page.doSearch("oat");         
  40.         page.waitToLoad(2000);  
  41.         // 在結構頁面進行驗證  
  42.         boolean result = resultPage.isTextPresent("oat");  
  43.         Assert.assertTrue("Text oat is present", result);  
  44.     }  
  45.   
  46.     @After  
  47.     public void tearDown() throws Exception {  
  48.         oat.stop();  
  49.         oat = null;  
  50.         page = null;  
  51.         selenium = null;  
  52.     }  
  53.   
  54. }  

 

Oat.getInstance(Object engine):用於獲取真正的Driver:google

Java代碼  收藏代碼
  1. //能夠根據傳入的不一樣engine,實例化不一樣的Vendor  
  2. public static Oat getInstance(Object engine) {  
  3.         if(instance == null) {  
  4.             synchronized(Oat.class) {  
  5.                 if(instance == null) {  
  6.                       
  7.                     String vendorTypeStr = getVendorTypeStr();  
  8.                       
  9.                     try {  
  10.                         Class<?> vendorType = Class.forName(vendorTypeStr);  
  11.                         Vendor vendor = getVendor(vendorType, engine);                
  12.                         instance = new Oat();  
  13.                         instance.vendor = vendor;  
  14.                           
  15.                     } catch (ClassNotFoundException e) {  
  16.                         throw new RuntimeException("Not Found vendor " + vendorTypeStr, e);  
  17.                     }   
  18.                 }  
  19.             }  
  20.         }  
  21.           
  22.         return instance;  
  23.     }  

 

Oat.getPage()方法詳解url

Java代碼  收藏代碼
  1. public Page getPage(Class<? extends Page> pageType) {  
  2.         Page page = null;  
  3.           
  4.         page = initialize(pageType);  
  5.         page.setVendor(vendor);  
  6.           
  7.     }  
  8.   
  9. private Page initialize(Class<? extends Page> pageType) {  
  10.                 //讀取page類中的annotation  
  11.         OatPage anno = pageType.getAnnotation(OatPage.class);  
  12.           
  13.         if(anno == null) {  
  14.             throw new RuntimeException("Please add com.perficient.oat.component.annotaion.OatPage annotation in Page class!");  
  15.         }  
  16.           
  17.         Page page = null;  
  18.         try {  
  19.             page = pageType.newInstance();  
  20.         } catch (Exception e) {  
  21.             throw new RuntimeException("Page Class must have a non-parameter constructor.", e);  
  22.         }   
  23.           
  24.         Class<?> tempType = pageType;  
  25.           
  26.         while(tempType != null) {  
  27.             Field[] fields = tempType.getDeclaredFields();  
  28.               
  29.             for(Field field : fields ) {  
  30.                   
  31.                 com.perficient.oat.component.annotaion.Element annotation =   
  32.                     field.getAnnotation(com.perficient.oat.component.annotaion.Element.class);  
  33.                   
  34.                 if(annotation == null) {  
  35.                     continue;  
  36.                 }  
  37.                   
  38.                 Class<?> fieldClazz = field.getType();  
  39.                 // 只處理Element的子類  
  40.                 Class<? extends Element> elementClazz = fieldClazz.asSubclass(Element.class);  
  41.                   
  42.                 String locator = annotation.value();  
  43.                   
  44.                 field.setAccessible(true);  
  45.                                 //使用反射初始化Page類的各個Element子類,並賦予Locator值  
  46.                   
  47.                 try {  
  48.                     field.set(page, getElement(elementClazz, locator));  
  49.                 } catch (Exception e) {  
  50.                     throw new RuntimeException("set Element " + field.getName() + " error", e);  
  51.                 }  
  52.             }  
  53.               
  54.             tempType = tempType.getSuperclass();  
  55.         }  
  56.           
  57.         return page;  
  58.           
  59.     }  
  60. //用於初始化Page類中的各個Element子類  
  61. private Element getElement(Class<? extends Element> elementType, String locator) {  
  62.         Element element = null;  
  63.         try {  
  64.             element = elementType.newInstance();  
  65.             element.setLocator(locator);  
  66.             element.setVendor(vendor);  
  67.         } catch (Exception e) {  
  68.             throw new RuntimeException(e);  
  69.         }   
  70.         return element;  
  71.     }  

 

 

 

以上就是一個完整的基於Selenium driver的框架實現.如下是咱們的Vendor接口:spa

Java代碼  收藏代碼
  1. public interface Vendor {  
  2.       
  3.     public void start();  
  4.     public void stop();  
  5.     public void open(String url);  
  6.     public void openWindow(String url, String windowId);  
  7.     public void type(String locator, String value);  
  8.     public void check(String locator);  
  9.     public void uncheck(String locator);  
  10.     public boolean isChecked(String locator);  
  11.     public boolean isEditable(String locator);  
  12.     public void select(String selectLocator, String optionLocator);  
  13.     public String getSelectedLabel(String locator);  
  14.     public String[] getSelectedLabels(String locator);  
  15.     public boolean isSelected(String label);  
  16.     public void submit(String formLocator);  
  17.     public void click(String locator);  
  18.     public boolean isTextPresent(String pattern);  
  19.     public boolean isElementPresent(String locator);  
  20.     public void waitForPageToLoad(String timeout);  
  21.     public void windowFocus(String windowId);  
  22.     public String getAttribute(String attributeLocator);  
  23.     public String getTableCellValue(String locator, int row, int col);  
  24.     public void waitForElementToLoad(String locator, String timeout);  
  25.     public String getLocation();  
  26. }  

 如下是seleniumVendor的實現:

Java代碼  收藏代碼
  1. public class SeleniumVendor extends VendorTemplate<Selenium> {  
  2.   
  3.     @Override  
  4.     protected Selenium createEngine(VendorAttribute attribute) {  
  5.         return new DefaultSelenium(  
  6.                 attribute.getHost(),   
  7.                 attribute.getPort(),  
  8.                 attribute.getBrowser(),  
  9.                 attribute.getUrl());  
  10.     }  
  11.       
  12.     @Override  
  13.     public boolean isTextPresent(String pattern) {  
  14.         return engine.isTextPresent(pattern);  
  15.     }  
  16.   
  17.     @Override  
  18.     public void open(String url) {  
  19.         engine.open(url);  
  20.           
  21.     }  
  22.   
  23.     @Override  
  24.     public void select(String selectLocator, String optionLocator) {  
  25.         engine.select(selectLocator, optionLocator);  
  26.     }  
  27.   
  28.     @Override  
  29.     public void start() {  
  30.         engine.start();  
  31.     }  
  32.   
  33.     @Override  
  34.     public void stop() {  
  35.         engine.stop();  
  36.     }  
  37.   
  38.     @Override  
  39.     public void submit(String formLocator) {  
  40.         engine.submit(formLocator);  
  41.           
  42.     }  
  43.   
  44.     @Override  
  45.     public void type(String locator, String value) {  
  46.         engine.type(locator, value);  
  47.     }  
  48.   
  49.     @Override  
  50.     public void click(String locator) {  
  51.         engine.click(locator);  
  52.           
  53.     }  
  54.   
  55.     @Override  
  56.     public void waitForPageToLoad(String timeout) {  
  57.         engine.waitForPageToLoad(timeout);  
  58.           
  59.     }  
  60.   
  61.     @Override  
  62.     public void windowFocus(String windowId) {  
  63.         engine.selectWindow(windowId);  
  64.         engine.windowFocus();  
  65.     }  
  66.   
  67.     @Override  
  68.     public void openWindow(String url, String windowId) {  
  69.         engine.openWindow(url, windowId);  
  70.     }  
  71.   
  72.     @Override  
  73.     public void check(String locator) {  
  74.         engine.check(locator);  
  75.           
  76.     }  
  77.   
  78.     @Override  
  79.     public String getAttribute(String attributeLocator) {  
  80.         return engine.getAttribute(attributeLocator);  
  81.     }  
  82.   
  83.     @Override  
  84.     public boolean isElementPresent(String locator) {  
  85.         return engine.isElementPresent(locator);  
  86.     }  
  87.   
  88.     @Override  
  89.     public void uncheck(String locator) {  
  90.         engine.uncheck(locator);  
  91.           
  92.     }  
  93.   
  94.     @Override  
  95.     public boolean isChecked(String locator) {  
  96.         return engine.isChecked(locator);  
  97.     }  
  98.   
  99.     @Override  
  100.     public String getSelectedLabel(String locator) {  
  101.         return engine.getSelectedLabel(locator);  
  102.     }  
  103.   
  104.     @Override  
  105.     public String[] getSelectedLabels(String locator) {  
  106.         return engine.getSelectedLabels(locator);  
  107.     }  
  108.   
  109.     @Override  
  110.     public boolean isSelected(String label) {  
  111.         return engine.isSomethingSelected(label);  
  112.     }  
  113.   
  114.     @Override  
  115.     public boolean isEditable(String locator) {  
  116.         return engine.isEditable(locator);  
  117.     }  
  118.   
  119.     @Override  
  120.     public String getTableCellValue(String locator, int row, int col) {  
  121.         return engine.getTable(locator + "." + String.valueOf(row)+ "." +String.valueOf(col));  
  122.     }  
  123.   
  124.     @Override  
  125.     public void waitForElementToLoad(String locator, String timeout) {  
  126.         String script = "selenium.isElementPresent(\"" + locator + "\")";  
  127.         engine.waitForCondition(script, timeout);  
  128.     }  
  129.   
  130.     @Override  
  131.     public String getLocation() {  
  132.         return engine.getLocation();  
  133.     }  
  134.   
  135.   
  136. }  

 

若是咱們須要改爲其餘Dirver,新創建一個Vendor的實現類便可

相關文章
相關標籤/搜索