移动UI自动化,看起来美好,践行起来却难。做个目光短见的务实主义者。Page Objects Pattern是Selenium官方推崇的方式,最近研究写测试用例最佳实践之Page Objects,同时结合Appium的Java Client简单介绍下如何写出靠谱的Page Object。

Page Objects

Page Object定义为抽象web app页面的一系列对象,通过对页面功能的封装,它得到了很多好处:

  • 减少重复代码
  • 提高测试代码的可读性和稳定性
  • 测试代码易于维护

一个简单的例子

public class BaiduSearchPage {

	protected WebDriver driver;
@FindBy(id="kw")
private WebElement kw;
private WebElement su; public BaiduSearchPage(WebDriver driver) {
super();
this.driver = driver;
PageFactory.initElements(driver, this);
} public void load(String url) {
driver.get(url);
} public ResultPage search(String key) {
kw.clear();
kw.sendKeys(key);
su.click();
return new ResultPage(driver);
}
}

推荐的做法

  • public 方法暴露Page对象的服务
  • WebElement,Driver相关页面UI细节尽可能隐藏
  • 尽量减少Page对象中的Assertion
  • 到达新的Page,在方法中返回其它Page,甚至同一页面也可以返回Page做链式操作
  • 一个Page对象不需要关注所有细节,只关心需要的对象,需要时再补充
  • 不同的结果,同一个操作可以用不同的方法。

Appium 中使用Page Object Pattern

Appium的Java Client是基于WebDriver的,但有了一些改进。比如元素定位不到,Appium Java Client会将Locator详细信息抛出,而Selenium没有。

Wait

移动自动化测试Wait是很关键的一个动作,既关乎正确性,也关乎效率,我们应该极力避免使用Thread.sleep()或Sleeper.sleepTight()。Appium的客户端提供了一个类AppiumFieldDecorator可以很方便的设置ImplicitlyWaitTimeOut。FieldDecorator顾名思义,是Page对象Field的Decorator,PageFactory主要就是在Feild上下功夫,将WebElement类型的Feild使用Proxy方法,创建一个增强的WebElement,这个成员在每次操作时,都会先使用注解的定位策略定位,然后再调用WebElement的方法,当然可以通过CacheLookup注解,来缓存定位结果(尽量不这么做)。

PageFactory.initElements(new AppiumFieldDecorator(driver, 5, TimeUnit.SECONDS), pageObject);

如果等待某个页面元素是否可见,在PageObject中也更简单

public static void untilElementVisable(final WebElement element,int timeoutInSeconds){
new Wait() {
@Override
public boolean until() {
return element.isDisplayed();
}
}.wait(String.format("Timed out waiting for %s. Waited %s",
element, timeoutInSeconds), timeoutInSeconds);
}

FindBy

在Appium中你会遇到,Selendroid模式和UIAutomator定位差异,比如Selendroid的linkText在UIAutomator中用name,还有就是iOS脚本想和Android共用一份。这在Appium中有了很好的扩充,Appium客户端会在运行时决定使用哪个Annotation来装饰WebElement。

    @FindBy(name="text")
@SelendroidFindBy(name = "text1")
@iOSFindBy(id="sth")
private WebElement textSelendroid;

ElementInterceptor

总是有这样或那样的原因,需要记录日志,如果方法的执行每一步都要手写是很痛苦的,自然我们想到了AOP。在Selenium中EventFiringWebDriver类可以方便的记录日志,但是在Appium客户端中,我们可以修改AppiumFieldDecorator中ElementInterceptor来加入自己的日志信息,不过暂时这个功能Appium Client没有暴露出来,需要自己fork个repo修改下。

参考

http://assertselenium.com/automation-design-practices/page-object-pattern/

https://code.google.com/p/selenium/wiki/LoadableComponent

https://code.google.com/p/selenium/wiki/PageObjects

https://code.google.com/p/selenium/wiki/PageFactory

https://github.com/FluentLenium/FluentLenium

https://github.com/countableSet/webdriver-demo

移动UI自动化-Page Objects Pattern的更多相关文章

  1. 通过Java + selenium +testNG + Page Objects 设计模式 实现页面UI的自动化

    Page Objects 设计模式 简单的讲,类似与Java面向对象编程,把每个页面都抽象为一个对象类,将页面元素的定位.业务逻辑操作分离开,然后我们可以通过testNG实现业务流程的控制 与 测试 ...

  2. [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式

    写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...

  3. UI自动化测试之Jenkins配置

    前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家. 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化 ...

  4. Selenium - WebDriver: Page Objects

    This chapter is a tutorial introduction to page objects design pattern. A page object represents an ...

  5. Page Objects

    Page Objects 原文地址:https://github.com/SeleniumHQ/selenium/wiki/PageObjects Within your web app's UI t ...

  6. UI 自动化框架设想

    测试框架选型: 首先,通过利用TestNG结合csv的使用,将测试用例数据转化为测试代码中的数据,减少了测试人员录入数据和准备数据的工具: 再次,通过对appium的封装,按照面向对象的思想将测试中用 ...

  7. 聊聊UI自动化的PageObject设计模式

    当我们开发UI自动化测试用例时,需要引用页面中的元素(数据)才能够进行点击(动作)并显示出页面内容.如果我们开发的用例是直接对HTML元素进行操作,则这样的用例无法"应对"页面中U ...

  8. 【Android测试】UI自动化代码优化之路(临时发布, 随时删除)

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...

  9. pywinauto处理UI自动化

    之前一个项目的特殊性, 以及一些操作权限上的问题,不能使用现有工具进行UI自动化. 在一些资深tester建议下决定采用Python的pywinauto模块来处理Windows控件的UI操作. 1. ...

随机推荐

  1. 非常不错的ASP操作数据库类,支持多数据库MSSQL,ACCESS,ORACLE,MYSQL等

    可同时操作多个不同类型的数据库. 完全不用考虑数据类型的差别,再也不用想字符型字段加不加单引号. 调用非常简单,对数据库的主要操作一般只需要一行代码. 支持mssql事务回滚. 可自动生成和输出sql ...

  2. 解决UITabeleViewCell的分割线不能铺满问题

    -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)] ...

  3. How to handle the DbEntityValidationException in C#

    When I want to use db.SaveChanges(), if some of the columns got validation error and throw DbEntityV ...

  4. hbase的存储体系

    一.了解hbase的存储体系. hbase的存储体系核心的有Split机制,Flush机制和Compact机制. 1.split机制 每一个hbase的table表在刚刚开始的时候,只有一个regio ...

  5. 【BZOJ1146】【树链剖分+平衡树】网络管理Network

    Description M 公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通 信网络.该网络的结构由N个 ...

  6. 仿小米网jQuery全屏滚动插件fullPage.js

    演 示 下 载   简介 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面,QQ浏 ...

  7. jQuery慢慢啃之CSS(六)

    1.css(name|pro|[,val|fn])//访问匹配元素的样式属性 $("p").css("color");//获取 $("p") ...

  8. select控件变成可输入状态

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. asp.net gridview中增加单击单元格事件

    实现功能:单击表格中某个单元格(不是第一列.最后一列.最后一行,不为0)根据行第一个单元格内容及列名来查询详细内容,在消息框中查看显示. 在代码中增加 protected override void ...

  10. 在Lufylegend中如何设置bitmap或者sprite的缩放和旋转中心

    最近两天有个lufylegend游戏引擎群的群友需要做一个项目,其中要解决的需求是:获取照相机拍摄的图片,根据图片的EXIF信息让图片显示为“正常”情况,并且需要给图片添加一些事件侦听.何为正常呢?就 ...