简介
原创文章,转载请注明出处
这个框架的名字叫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的实现类即可
相关推荐
本项目是一个基于Selenium的Web自动测试框架,通过该框架可以简化测试人员的学习难度,只要编写少量的Java代码即可,大多数的工作都是编写页面元素的描述文件以及对应的数据源。
使用Java+Maven+Selenium+TestNG+Jedis+Jenkins搭建的WebUI自动化测试框架,资源的大体介绍如下链接http://note.youdao.com/noteshare?id=dc564343fd126f497074f6d7560c9f5e&sub=387EB3B1BAC945CEA71A5BDBC6484473
springboot、Dubbo、MySQL,源码web系统,框架,代码均经过严格测试,可直接运行,有需要可自取
这是一个WebUI自动化测试框架,由webdriver中文社区创办人土豆(本人技术笔名)所创建,该web自动化测试框架是用java语言编写的,基于selenium webdriver 的开源自动化测试框架,该框架结合了testng,selenium,webdriver...
以 APP 自动化测试为例:只需要创建一个自动化测试项目,并且依赖 APP 自动化测试框架 autotest-app 即可。 ```xml <groupId>com.qianmi</groupId> <artifactId>autotest-app <version>2.0.0-SNAPSHOT ```...
对于UI自动化测试框架-如果您使用的是Java,希望这已经足够。 该框架基于cumul-java和selenium-java,请尝试使其更稳定并具有足够的功能来进行Web-UI测试。 现有功能 有关Cucumber的基本功能; 页面对象 物业管理...
这是一个关于python的WebUI自动化测试的项目,之前用的是unittest测试框架,现在改成pytest测试框架,Python+PageObject+Pytest 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、...
ui自动化一个基于Java的ui自动化框架,支持Cucumber/确保放心/协和,还提供了漂亮的报告ui-automation是基于Cucumber-jvm,java的自动化BDD测试框架/解决方案。 它提供以下功能: 易于配置后,最多可并行执行多线程...
通过Selenium实现web UI自动化,appium + stf实现android UI自动化,保证前端页面操作功能及业务流程 通过testng对测试脚本进行管理,范围报告实现报告输出 通过maven实现脚本CI(jerkins),tomcat实现测试报告线上...
凤凰自动测试本项目是一个基于的Web自动测试框架,通过该框架可以简化测试人员的学习技巧,只需编写少量的Java代码即可,大多数的工作都是编写页面元素的描述文件以及对应的数据源。以下是本框架的特色:支持多种...
PatatiumWebUi 简介 这是一个WebUI自动化测试框架,由 webdriver中文社区 创办人土豆(本人技术笔名)所创建,该web自动化测试框架是用java语言编写的,基于seleniumwebdriver的开源自动化测试框架,该框架结合了...
松散的 使用Teasy轻松进行测试-UI自动化测试框架描述Teasy是基于Java的测试框架,建立在Selenium和TestNG之上。 它的目标是通过为您在 UI 自动化测试期间将面临的许多问题提供解决方案,使您的 Web 测试更容易。 请...
根据公司内部题和培训机构老师整理的这些年来高频的自动化测试相关面试题。 涵盖了API接口自动化、接口测试、web自动化、UI、APP自动化等、分层测试相关的内容。...也是当前最流行最常用的自动化框架。
Smart-ui-framework-轻巧,强大的Web / Android / IOS UI自动化框架 Smart-ui-framework是基于 , 和的轻便,强大的Web / Android / IOS UI自动化框架。 标签:Selenium,Appium,Webdriver,TestNG,自动化,...
传统的自动化测试更关注产品UI 层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段(层 次)都需要自动化测试。 相信测试同学对上面的金字塔并不陌生,这个就是产品开发各个同阶段所对应的测试!随然这个...
这是一个WebUI自动化测试框架,由创办人土豆(本人技术笔名)所创建,该web自动化测试框架是用java语言编写的,基于selenium webdriver 的开源自动化测试框架,该框架结合了testng,selenium,webdriver,jxl,jodd-http ...
本文来自博客园,本文主要通过配置环境变量以及eclipse中安装testNG插件,希望对您的...系统变量中新建一个变量名称为Java_Home,存放的路径为jdk的安装目录的路径:C:\ProgramFiles\Java\jdk-version新建变量Path:
网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...