上次介紹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 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默認僅僅支持不多的僞屬性:
[: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對僞類和僞屬性的擴展就暫時講到這裏,後文講解避免重複註冊僞類和僞屬性的方法。