`

一个简单的Web UI自动化测试框架Java实现

阅读更多

简介

原创文章,转载请注明出处

这个框架的名字叫OAT,全称Object-Oriented  Automation Test.这个框架的思想借助于Tellurium框架.他的主要功能是将页面信息及行为存储在Java 对象中,然后在脚本中引用页面的行为.自动化程序最终由许多的页面行为组成.这个框架默认使用Selenium1驱动,并且可以通过编程使用其他驱动,因为OAT是面向接口的.

 

以下以google home page的demo为例,介绍这个基于Annoation和反射的框架基本运行原理.

 

page对象

 

//存储页面URL
@OatPage("webhp") 
public class GooglePage extends Page{
	@Element("q") // 搜索输入框的定位符
	private TextField textField;
	@Element("btnG") // 搜索按钮的定位符
	private Button searchButton;
	
	// TextField和Button有共同的祖先类Element
	public TextField getTextField() {
		return textField;
	}
	public Button getSearchButton() {
		return searchButton;
	}
	//进行一次搜索
	public void doSearch(String q){
		this.textField.type(q);
		this.searchButton.click();
	}	

}

 TextField和button类

 

// Element子类,有自己独特的行为
public class TextField extends Element {
	
	public void type(String value) {
		vendor.type(locator, value);
	}
	
	public boolean idEditable(){
		return vendor.isEditable(locator);		
	}
	
	public String getValue() {
		return vendor.getAttribute(locator);
	}

}
// 同样是Element的子类,有自己行为
public class Button extends Element {
	
	
	public void click() {
		vendor.click(locator);
	}
	
	public void clickAndWaitToLoad(Page page){
		click();
		page.waitToLoad();
	}
	
	public void clickAndWaitToLoad(Page page, long timeout) {
		click();
		page.waitToLoad(timeout);
	}
	
	public void clickAndWaitToLoad(Element element, long timeout) {
		click();
		element.waitToLoad(timeout);
	}
	
	public void clickAndWaitToLoad(Element element) {
		clickAndWaitToLoad(element, ELEMENT_DEFAULT_TIMEOUT);
	}
	
}
 

 

自动化测试脚本代码

 

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class GoogleSearchTestExample1 {
	
	private String serverUrl = "localhost";
	private int serverPort = 4444;
	private String browserCommand = "googlechrome";
	private String url = "http://www.google.com.hk";
	
	private GooglePage page;
	private GoogleResultPage resultPage;
	private Selenium selenium;
	private Oat oat;

	@Before
	public void setUp() throws Exception {
		// 初始化selenium
		selenium = new DefaultSelenium(serverUrl,serverPort,browserCommand, url);
		// Oat类是框架总的控制器,设置Selenium为背后的驱动
		oat = Oat.getInstance(selenium);
		oat.start();
		oat.open("/webhp");
		// 初始化被测试页面
		page = (GooglePage) oat.getPage(GooglePage.class);
		resultPage = (GoogleResultPage) oat.getPage(GoogleResultPage.class);

	}
	
	@Test
	public void testSearch() throws InterruptedException {
		// 在google页面收入"oat"进行搜索
                page.doSearch("oat");		
		page.waitToLoad(2000);
		// 在结构页面进行验证
		boolean result = resultPage.isTextPresent("oat");
		Assert.assertTrue("Text oat is present", result);
	}

	@After
	public void tearDown() throws Exception {
		oat.stop();
		oat = null;
		page = null;
		selenium = null;
	}

}

 

Oat.getInstance(Object engine):用于获取真正的Driver:

//可以根据传入的不同engine,实例化不同的Vendor
public static Oat getInstance(Object engine) {
		if(instance == null) {
			synchronized(Oat.class) {
				if(instance == null) {
					
					String vendorTypeStr = getVendorTypeStr();
					
					try {
						Class<?> vendorType = Class.forName(vendorTypeStr);
						Vendor vendor = getVendor(vendorType, engine);				
						instance = new Oat();
						instance.vendor = vendor;
						
					} catch (ClassNotFoundException e) {
						throw new RuntimeException("Not Found vendor " + vendorTypeStr, e);
					} 
				}
			}
		}
		
		return instance;
	}

 

Oat.getPage()方法详解

public Page getPage(Class<? extends Page> pageType) {
		Page page = null;
		
		page = initialize(pageType);
		page.setVendor(vendor);
		
	}

private Page initialize(Class<? extends Page> pageType) {
                //读取page类中的annotation
		OatPage anno = pageType.getAnnotation(OatPage.class);
		
		if(anno == null) {
			throw new RuntimeException("Please add com.perficient.oat.component.annotaion.OatPage annotation in Page class!");
		}
		
		Page page = null;
		try {
			page = pageType.newInstance();
		} catch (Exception e) {
			throw new RuntimeException("Page Class must have a non-parameter constructor.", e);
		} 
		
		Class<?> tempType = pageType;
		
		while(tempType != null) {
			Field[] fields = tempType.getDeclaredFields();
			
			for(Field field : fields ) {
				
				com.perficient.oat.component.annotaion.Element annotation = 
					field.getAnnotation(com.perficient.oat.component.annotaion.Element.class);
				
				if(annotation == null) {
					continue;
				}
				
				Class<?> fieldClazz = field.getType();
				// 只处理Element的子类
				Class<? extends Element> elementClazz = fieldClazz.asSubclass(Element.class);
				
				String locator = annotation.value();
				
				field.setAccessible(true);
                                //使用反射初始化Page类的各个Element子类,并赋予Locator值
				
				try {
					field.set(page, getElement(elementClazz, locator));
				} catch (Exception e) {
					throw new RuntimeException("set Element " + field.getName() + " error", e);
				}
			}
			
			tempType = tempType.getSuperclass();
		}
		
		return page;
		
	}
//用于初始化Page类中的各个Element子类
private Element getElement(Class<? extends Element> elementType, String locator) {
		Element element = null;
		try {
			element = elementType.newInstance();
			element.setLocator(locator);
			element.setVendor(vendor);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} 
		return element;
	}

 

 

 

以上就是一个完整的基于Selenium driver的框架实现.以下是我们的Vendor接口:

public interface Vendor {
	
	public void start();
	public void stop();
	public void open(String url);
	public void openWindow(String url, String windowId);
	public void type(String locator, String value);
	public void check(String locator);
	public void uncheck(String locator);
	public boolean isChecked(String locator);
	public boolean isEditable(String locator);
	public void select(String selectLocator, String optionLocator);
	public String getSelectedLabel(String locator);
	public String[] getSelectedLabels(String locator);
	public boolean isSelected(String label);
	public void submit(String formLocator);
	public void click(String locator);
	public boolean isTextPresent(String pattern);
	public boolean isElementPresent(String locator);
	public void waitForPageToLoad(String timeout);
	public void windowFocus(String windowId);
	public String getAttribute(String attributeLocator);
	public String getTableCellValue(String locator, int row, int col);
	public void waitForElementToLoad(String locator, String timeout);
	public String getLocation();
}

 以下是seleniumVendor的实现:

public class SeleniumVendor extends VendorTemplate<Selenium> {

	@Override
	protected Selenium createEngine(VendorAttribute attribute) {
		return new DefaultSelenium(
				attribute.getHost(), 
				attribute.getPort(),
				attribute.getBrowser(),
				attribute.getUrl());
	}
	
	@Override
	public boolean isTextPresent(String pattern) {
		return engine.isTextPresent(pattern);
	}

	@Override
	public void open(String url) {
		engine.open(url);
		
	}

	@Override
	public void select(String selectLocator, String optionLocator) {
		engine.select(selectLocator, optionLocator);
	}

	@Override
	public void start() {
		engine.start();
	}

	@Override
	public void stop() {
		engine.stop();
	}

	@Override
	public void submit(String formLocator) {
		engine.submit(formLocator);
		
	}

	@Override
	public void type(String locator, String value) {
		engine.type(locator, value);
	}

	@Override
	public void click(String locator) {
		engine.click(locator);
		
	}

	@Override
	public void waitForPageToLoad(String timeout) {
		engine.waitForPageToLoad(timeout);
		
	}

	@Override
	public void windowFocus(String windowId) {
		engine.selectWindow(windowId);
		engine.windowFocus();
	}

	@Override
	public void openWindow(String url, String windowId) {
		engine.openWindow(url, windowId);
	}

	@Override
	public void check(String locator) {
		engine.check(locator);
		
	}

	@Override
	public String getAttribute(String attributeLocator) {
		return engine.getAttribute(attributeLocator);
	}

	@Override
	public boolean isElementPresent(String locator) {
		return engine.isElementPresent(locator);
	}

	@Override
	public void uncheck(String locator) {
		engine.uncheck(locator);
		
	}

	@Override
	public boolean isChecked(String locator) {
		return engine.isChecked(locator);
	}

	@Override
	public String getSelectedLabel(String locator) {
		return engine.getSelectedLabel(locator);
	}

	@Override
	public String[] getSelectedLabels(String locator) {
		return engine.getSelectedLabels(locator);
	}

	@Override
	public boolean isSelected(String label) {
		return engine.isSomethingSelected(label);
	}

	@Override
	public boolean isEditable(String locator) {
		return engine.isEditable(locator);
	}

	@Override
	public String getTableCellValue(String locator, int row, int col) {
		return engine.getTable(locator + "." + String.valueOf(row)+ "." +String.valueOf(col));
	}

	@Override
	public void waitForElementToLoad(String locator, String timeout) {
		String script = "selenium.isElementPresent(\"" + locator + "\")";
		engine.waitForCondition(script, timeout);
	}

	@Override
	public String getLocation() {
		return engine.getLocation();
	}


}

 

如果我们需要改成其他Dirver,新建立一个Vendor的实现类即可

1
1
分享到:
评论
2 楼 lijingshou 2014-01-28  
fengbin2005 写道
介绍很详细,谢谢!

欢迎光临
1 楼 fengbin2005 2014-01-28  
介绍很详细,谢谢!

相关推荐

    基于Selenium的WebUI自动化测试框架(Java+Maven+Selenium+TestNG+Jedis+Jenkins)

    使用Java+Maven+Selenium+TestNG+Jedis+Jenkins搭建的WebUI自动化测试框架,资源的大体介绍如下链接http://note.youdao.com/noteshare?id=dc564343fd126f497074f6d7560c9f5e&sub=387EB3B1BAC945CEA71A5BDBC6484473

    自动化测试框架,支持接口自动化、WEB UI自动化、APP UI自动化

    【标题】中的“自动化测试框架,支持接口自动化、WEB UI自动化、APP UI自动化”涉及到的是软件测试领域的一个重要话题。这个框架集成了多种自动化测试的能力,涵盖了从后端API到前端UI的全方位测试。 首先,接口...

    WebUI自动化测试框架

    【WebUI自动化测试框架】是一种高效且便捷的测试解决方案,主要针对Web应用程序的用户界面进行自动化测试。这个框架是建立在Selenium库之上的,Selenium是一个强大的、跨平台的Web自动化测试工具,支持多种浏览器和...

    基于Java的Phoenix WebUI自动化测试框架设计源码 - phoenix.framework

    本源码提供了一个基于Java的Phoenix WebUI自动化测试框架的设计。项目包含178个文件,其中包括127个Java文件、15个Markdown文档、14个XML文件、9个Properties文件、2个YAML文件,以及用于版本控制和文档的文件。此外...

    WebUI自动化测试项目,支持截图和录屏,一个元素多种定位方式

    在IT行业中,WebUI自动化测试是一项关键任务,用于确保网页应用程序的功能性和用户界面的稳定性。本项目专注于构建一套全面的自动化测试解决方案,尤其强调了截图和录屏功能,以及元素的多方式定位,这些特性使得...

    Web UI自动化测试总结以及unittest框架初识.zip

    在本资料中,我们主要聚焦于Web UI自动化测试的总结以及Python的unittest框架的初步认识。 首先,Web UI自动化测试是针对Web应用程序用户界面的自动测试,通常涉及浏览器上的交互操作,如点击按钮、填写表单、导航...

    phoenix.webui.framework, 基于WebDriver的WebUI自动化测试框架.zip

    "phoenix.webui.framework"是一个基于WebDriver的Web用户界面(WebUI)自动化测试框架,它为开发者和测试工程师...一旦掌握,phoenix.webui.framework将大大提高你的WebUI自动化测试能力,降低测试成本,提升软件质量。

    UI自动化测试框架,支持APP、Web、HTML5三端, 基于SpringBoot框架.zip

    【UI自动化测试框架,支持APP、Web、HTML5三端,基于SpringBoot框架】 这个压缩包文件提供的是一款全面的UI自动化测试框架,它能够覆盖移动应用(APP)、Web应用程序以及HTML5网页的测试需求。这样的框架对于现代...

    java+selenium+maven+testng自动化测试框架实例(实际项目)

    Java+Selenium+Maven+TestNG自动化测试框架是现代软件开发中的一个重要组成部分,尤其是在Web应用程序的质量保证阶段。这个实例项目展示了如何将这四个强大的工具集成为一套完整的自动化测试解决方案。 **Java**: ...

    基于appium+java 的APP UI自动化测试框架.zip

    【标题】"基于appium+java 的APP UI自动化测试框架.zip"揭示了这个压缩包内容主要涉及使用Appium和Java语言构建的移动应用UI自动化测试框架。Appium是一款开源的自动化测试工具,它允许开发者对Android和iOS平台的...

    基于selenium webdriver 自动化测试框架

    这是一个WebUI自动化测试框架,由webdriver中文社区创办人土豆(本人技术笔名)所创建,该web自动化测试框架是用java语言编写的,基于selenium webdriver 的开源自动化测试框架,该框架结合了testng,selenium,webdriver...

    web版本自动化测试报告

    3. Appium:对于移动Web应用,Appium提供了一个统一的接口,支持iOS和Android平台的自动化测试。 三、自动化测试流程 1. 测试设计:确定测试目标,编写测试用例,根据需求分析设计断言。 2. 编码实现:选择合适的...

    这是一个关于python的WebUI自动化测试的项目,之前用的是uni-python_web_framework.zip

    总的来说,uni-python_web_framework是一个集成化、易用的Python WebUI自动化测试解决方案,它结合了Selenium的浏览器自动化能力、unittest或PyTest的测试框架、Page Object模式的设计原则,以及数据驱动测试和全面...

    自动化测试框架

    本文将详细介绍一种基于CODEUI的自动化测试框架的设计与实现,该框架采用文本模板引擎(T4)来生成相关的自动化测试代码。 ##### 单元测试框架 单元测试框架是用于验证应用软件中的最小可测试单元的工具。常见的...

    UI自动化测试框架,支持APP、Web、HTML5三端, 基于SpringBoot框架, 支持消息通知、失败截屏+源代码+文档说

    以 APP 自动化测试为例:只需要创建一个自动化测试项目,并且依赖 APP 自动化测试框架 autotest-app 即可。 ```xml &lt;groupId&gt;com.qianmi&lt;/groupId&gt; &lt;artifactId&gt;autotest-app &lt;version&gt;2.0.0-SNAPSHOT ```...

    WebUI自动化详解说明文档.zip

    WebUI自动化测试是一种提高软件测试效率的技术,尤其在网页应用开发中广泛应用。它涉及使用编程语言和工具自动执行浏览器上的用户界面操作,以验证应用程序的功能和性能。本篇将深入探讨WebUI自动化测试的核心概念、...

    UI自动化测试方案设计--培训.pptx

    【UI自动化测试方案设计】是IT行业内针对提升测试效率和质量的一种重要手段,尤其在Web应用的测试领域中,自动化测试扮演着不可或缺的角色。本培训PPT主要涵盖了以下几个核心知识点: 1. **自动化测试概念与分层**...

    cucumber-java:对于UI自动化测试框架-这已经足够

    对于UI自动化测试框架-如果您使用的是Java,希望这已经足够。 该框架基于cumul-java和selenium-java,请尝试使其更稳定并具有足够的功能来进行Web-UI测试。 现有功能 有关Cucumber的基本功能; 页面对象 物业管理...

Global site tag (gtag.js) - Google Analytics