開源手機自動化測試框架iQuery入門教程(二)

上次介紹iQuery以後,已經有些朋友在開始在手機自動化測試程序裏試用iQuery了,因爲以前的介紹文檔比較含糊,先擱置擴展iQuery使其支持多種編程語言的系列文章,補充一下iQuery的入門教程,以前寫的介紹性文章能夠參考:
1.    開源類庫iQuery Android版使用說明
2.    類jQuery selector的控件查詢iQuery開源類庫介紹
3.    開源手機自動化測試框架iQuery入門教程(一)css

iQuery是一個開源的自動化測試框架項目,有興趣的朋友能夠在這裏下載:https://github.com/vowei/iQuery/downloadshtml

源碼位置:https://github.com/vowei/iQuery
java

在iQuery裏增長新的僞類

在前文開源類庫iQuery Android版使用說明提到,iQuery語法包含有僞類、僞屬性等概念,咱們編寫iQuery的一個主要目標就是對測試人員隱藏多平臺上查找控件的差別性,而僞類和僞屬性就是隱藏不一樣平臺上控件差別性的核心方式,然而咱們在開發iQuery的時候,只提供了少數幾個僞類:
    :button – 表明按鈕控件,在不一樣的移動操做系統上,iQuery會將button這個僞類轉換相應的按鈕控件。
    :checkbox – 表明複選框控件。
    :radio – 表明單選框控件。
    :text – 表明文本編輯框控件。
    :label – 表明文本標籤控件。
    :image – 表明圖片控件。node

這樣作的目的是想保持iQuery的簡潔性,同時iQuery也提供了方法讓用戶測試開發工程師註冊自定義的僞類。git

好比說要註冊一個新的僞類「:switch」,這個僞類在iOS平臺上,表明「UIASwitch」類型的控件,在Android平臺上,表明「CheckBox」控件,註冊的方式以下:github

Android:
編程

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

在上例中,第一行首先建立一個iQueryParser對象,使用iQuery.createParser(String iquery)這個函數建立,若是看源碼可知,由這個函數建立的iQueryParser對象會註冊默認的僞類。第2行以後,經過iQueryParser.registerPseudoClass對象註冊僞類,該函數接受一個字符串參數 – 要註冊的僞類名,第二個參數是一個實現了IPseudoClass的對象,是一個回調函數,當iQueryParser碰到非默認的僞類時,會調用這個函數判斷一個UI控件對象是否歸屬於這個僞類。框架

iOS:
編程語言

var iq = new iQuery(「:switch」);
iq.parser. registerPseudoClass(「switch」, function(uiaobj) {
    return isMatch(uiaobj, new Array(「UIASwitch」));
});

跟Android版相似,第一行先建立一個iQuery對象,而後在第二行經過iQuery.parser實例變量的registerPseudoClass函數註冊一個僞類,和判斷控件是否屬於該僞類的回調函數。
函數

在iQuery裏增長新的僞屬性


跟僞類類似,iQuery默認僅僅支持不多的僞屬性:
    [:top] – 表示一個控件的左上角的y座標值。
    [:left] – 表示一個控件的左上角的x座標值。
    [:bottom] – 表示一個控件的右下角的y座標值。
    [:right] – 表示一個控件的右下角的x座標值。
    [:width] – 表示一個控件的寬度。
    [:height] – 表示一個控件的高度。

若是要註冊一個新的僞屬性,例如要註冊一個表示控件上文本的僞屬性:「:text」,在Android平臺上,對於一些控件,例如按鈕(Button)控件,表示其「mText」屬性,而在iOS上,則是按鈕控件的「name」屬性。下面是註冊僞屬性的方法:

Android:

iQueryParser parser = iQuery.createParser(「:switch」);
parser. registerPseudoAttribute (「text」, new IPseudoAttribute () {
public String resolve(ITreeNode node) {
        return node.getProperty("mText").getValue();
    }
});

在上例中,第1行跟僞類類似,第2行後使用iQueryParser. registerPseudoAttribute函數註冊一個新的僞屬性「text」,iQueryParser經過調用一個IPseudoAttribute接口類型的回調函數來獲取僞屬性的值。

iOS:

var iq = new iQuery(「:switch」);
iq.parser.registerPseudoAttrs("text", function(uiaobj) {
    if ( uiaobj != undefined && uiaobj.rect != undefined ) {
        return uiaobj.name();
    }
});

在上例中,第1行建立一個iQuery解析器,第二行註冊「text」僞屬性,和返回僞屬性值的回調函數。

爲了簡單起見,僞屬性要求返回的屬性值是字符串格式,而iQuery解析器在執行屬性值對比時,會根據給出的查詢上下文作相應的轉換。好比說:
1.    針對查詢語句:
「[:text = ‘abc’]」

因爲:text返回的屬性值是字符串格式,而對比的指望值也是字符串格式:「’abc’」,所以經過普通的字符串對比來完成過濾操做。

詳情請參看源代碼:
https://github.com/vowei/iQuery/blob/master/iOS/lib/iQuery.g 中對「'[' ':' attr=ELEMENT op v=QUOTED_STRING ']'」的處理,本文寫做時,爲源代碼的「184 - 219」行。

https://github.com/vowei/iQuery/blob/master/java/iquery/iquery-core/src/main/java/cc/iqa/iquery/iQuery.g 中對「'[' ':' attr=ELEMENT op v=QUOTED_STRING ']'」的處理,本文寫做時,爲源代碼的「388 - 424」行。

2.    而針對查詢語句:
「[:top = 123]」
雖然:top返回的屬性值是字符串格式,因爲對比的指望值是數字格式:「123」,所以在對比時,iQuery會將:top返回的字符串格式的屬性值轉化成數字,而後再作對比。

詳情請參看源代碼:
https://github.com/vowei/iQuery/blob/master/iOS/lib/iQuery.g 中對「'[' attr=ELEMENT num_comp_op v=(INTEGER | FLOAT | PERCENTAGE) ']'」的處理,本文寫做時,爲源代碼的「257 - 293」行。

https://github.com/vowei/iQuery/blob/master/java/iquery/iquery-core/src/main/java/cc/iqa/iquery/iQuery.g 中對「'[' attr=ELEMENT num_comp_op v=(INTEGER | FLOAT | PERCENTAGE) ']'」的處理,本文寫做時,爲源代碼的「425 - 479」行。

3.    可是對於查詢語句:
「[:text = 123]」
因爲:text返回的是字符串格式,而指望值「123」是一個數字格式,iQueryParser沒法將:text的值轉換成數字,所以可能會報錯。

對於iQuery對僞類和僞屬性的擴展就暫時講到這裏,後文講解避免重複註冊僞類和僞屬性的方法。

相關文章
相關標籤/搜索