代码改变世界

开源手机自动化测试框架iQuery入门教程(三)

2012-09-19 16:00  知平软件  阅读(2033)  评论(0编辑  收藏  举报

前几篇入门教程请参看:

  1. 开源类库iQuery Android版使用说明 
  2. 类jQuery selector的控件查询iQuery开源类库介绍 
  3. 开源手机自动化测试框架iQuery入门教程(一)
  4. 开源手机自动化测试框架iQuery入门教程(二)

iQuery是一个开源的自动化测试框架项目,有兴趣的朋友可以在这里下载:https://github.com/vowei/iQuery/downloads
源码位置:https://github.com/vowei/iQuery 

在前文讲了iQuery的伪类和伪属性的使用方法,以及注册一个新的伪类和伪属性的方式,例如在Android上注册一个伪类的代码:

iQueryParser parser = iQuery.createParser(“:switch”);
parser. registerPseudoClass(“switch”, new IPseudoClass() {
    public boolean resolve(ITreeNode node) {
        return filterByNameEndsWith(node, "CheckBox");
    }
});

然而如果每次使用自定义的伪类,都要重新注册伪类实现方式的话,那势必会让代码变得很臃肿,并难以维护。因此为了解决这个问题,在最近的代码更新中,实现了一个iQuery模板解释器的概念,其实模板解释器跟普通的解释器是完全一样的,只不过基于模板创建的解释器自动会继承模板里已经注册好的自定义伪类和伪属性。

在Android上,创建模板解释器和从模板里创建解释器的方法如下:

iQueryParser parserTemplate = iQuery.createParser("");
parserTemplate.registerPseudoAttribute("text", new IPseudoAttribute() {
    public String resolve(ITreeNode node) {
        return node.getText();
    }
});
parserTemplate.registerPseudoClass("tv", new IPseudoClass() {
    public boolean resolve(ITreeNode node) {
        return iQuery.filterByNameEndsWith(node, "TextView");
    }
});

iQueryParser parser = iQuery.createParser(":tv [:text = '登录']", parserTemplate);
LayoutTree tree = constructTree("testParserMethod.txt");
List<ITreeNode> nodes = parser.query(tree.getAllNodesCopy());
Assert.assertEquals(1, nodes.size());
Assert.assertTrue(nodes
                  .get(0)
                  .getName()
                  .compareTo("android.widget.TextView@44f379f0") == 0);

在上面的代码里,第1行使用iQuery.createParser(“”)的方式创建一个解释器模板,第2 – 11行在解释器模板上注册了一个伪属性和伪类,然后第13行从模板里创建一个新的解释器,这个解释器就自动继承了模板里的伪类和伪属性定义。

在iOS上,创建模板解释器和从模板里创建解释器的方法如下:

var iq = new iQuery("", true);
iq.parser.registerPseudoAttr("text", function(uiaobj) {
    if ( uiaobj != undefined ) {
        return uiaobj.name();
    }
});
iq.parser.registerPseudoClass("switch", function(uiaobj) {
    return isMatch(uiaobj, new Array("UIASwitch"));
});

var result = root.$("> :button[:text = 'Second']", iq);
assert.Equals(1, result.length);

result = root.$("> :switch", iq);
assert.Equals(1, result.length);

上面的代码里,跟Android版代码类似,第1行通过new iQuery(..)来创建一个模板解释器,其中第二个参数是指明创建模板解释器时,需要注册默认的伪类和伪属性,当然如果设置为false,则可以在代码里手工注册默认的伪类和伪属性,达到修改默认实现的目的。第2 – 9行在模板上注册伪类和伪属性,然后第11行和14行分别使用模板解释器来执行控件查询操作。