在Wait和Exception中,我们从定位问题做到了一定程度的效率提升,不过WebDriver提供给我们的秘技远不止这些。这里我们要讲另一个大杀器---Annotation。Annotation(注解)可能我们学习SSH和MVC的时候可能遇到比较多,用处我们就不用赘述了,最基本可以减少我们自己初始化对象的工作,同样WebDriver为了提供了这一便利,可以将我们找元素操作托管出去。接下去,我们来看下如何通过注解来提升自动化效率的。
FindBy(id = "foobar")
FindBy我们先从FindBy注解开始入门。通过这张图我们可以轻松的知道,查找className中有cover的元素就是我们的WebElement cover。这样的查找元素,是不是看起来比之前的方式简洁不少。当然如果匹配到元素时多个的时候,我们只需要把WebElement替换成List<WebElement>,其中到底是一个还是一个list,这种粗俗简单的事情交由WebDriver自己帮我们实现即可,我们只需要申明className="cover"的元素就是我们需要找的cover元素。
FindBys({FindBy(id = "foo"), FindBy(className = "bar")})
FindBys有时候,我们在定位元素的时候,发现需要上下文中多个定位器帮助我们定位(多个并且[&&]查询条件),当然WebDriver也为我们提供了这样的遍历,通过FindBys,会帮助我们查找className=brand的元素及子元素中含有className=info的元素。是不是有种不再需要复杂而又冗长的Xpath也能清晰的查找不易定位的元素了?不过由于使用了多个定位器,查询的性能上比起相对路径的Xpath还是有一定的差距的,所以在日常使用中,不要太多的组合使用,避免影响效率。
FindAll({FindBy(id = "foo"), FindBy(className = "bar")})
FindAll从FindBys到FindAll,我们不难猜出FindAll是一个或者[||]的查询条件了,所有包含id="foo"和className="bar"的元素都是我们查询结果,当然大部分条件下会返回给我们一个list。不过目前,用这种方式获取元素的场景还是较少的,可能在获取点赞或者收藏这两中元素选中和未选中的集合时会用到。
多端共用元素
随着互联网和移动互联网的不断发展,其实我们绝大多数的互联网产品,都会有Web端,Wap端,Android端,iOS端,面对这么多端,除却本身操作系统的差异,产品从设计开始,都是希望各端页面和交互尽量保持一致,来降低用户的使用成本和开发成本。既然各端相似度极高,那么对于测试人员,自然而然会冒出一个Idea:单一一个功能既然在各个端的逻辑和交互基本一致,那么在精益化的测试过程中,是否可以将这些功能交由1个人来完成?这里我们现在的客户端产品就是这么来分配我们的测试工作的,经实践分析,将iOS和Android合并测试后,可以做到效率的1.5-1.8倍提升。不得不说是一个喜大普奔的好结果。既然功能测试可以这么做,我们的自动化测试为啥不能也效仿这种做法呢?我们能想到的,WebDriver的大神们当然也不会落后,为了支持多端共用元素,也提供了高效可用的攻略:
多端共用元素从这里,我们可以看到同样一个元素SELECT_TOPIC元素,我们在Android,Selendroid和iOS中有着不一样的元素定位方式,当时这个完全不打紧,因为让用户感知到的就是这个元素,在自动化过程中,当我们启用不同的driver时,就会根据driver的device来确定是用@AndroidFindBy,@SelendroidFindBy或是@iOSFindBy了,是不是“居家旅行必备良药”?
总结
这里我们介绍了一系列查找元素的注解方式,从表象上,我们就能发现,通过一个简单的注解,就可以将driver.findElement(By)操作变得简洁明了,当然我们可以进一步联想到,其实就你可以用一个单独的文件来维护所有的元素,我们是否还记得Selenium 1.0时代比较流行的UIMAP设计模式?隐隐感觉在这里做到了又一次的重生,具体我们会在下一模块讲到。
网友评论