本發(fā)明涉及應(yīng)用測試技術(shù)領(lǐng)域,更具體的說,涉及一種功能遍歷與界面遍歷方法及系統(tǒng)。
背景技術(shù):
隨著Android系統(tǒng)市場占有率的增加,越來越多的開發(fā)者基于Android系統(tǒng)開發(fā)APP(Application,應(yīng)用)。每款A(yù)PP在開發(fā)完畢后,并不能馬上上線,因?yàn)樵趯?shí)際使用時(shí),有可能會(huì)出現(xiàn)在用戶點(diǎn)擊某個(gè)功能時(shí)沅法響應(yīng)、UI跳轉(zhuǎn)時(shí)跳轉(zhuǎn)失敗或者邏輯錯(cuò)誤等bug。因此,一般在APP開發(fā)完成之后,需要對所開發(fā)的APP進(jìn)行遍歷后,才能決定是否對該APP進(jìn)行發(fā)布。
目前,APP遍歷分成兩種,一種是UI(User Interface,用戶接口)界面的遍歷,其只要求遍歷完所有的界面即可,另一種是功能遍歷,其要求遍歷APP中的所有功能。在功能遍歷中,需要通過判斷UI界面的變化來確定某個(gè)UI界面的功能是否已經(jīng)完成遍歷,即使是在UI界面遍歷中,也需要保證每一個(gè)控件都被點(diǎn)擊過才能保證所有的界面都得到了遍歷。也就是說,需要通過判斷界面的變化來確定是否完成了功能遍歷和界面遍歷。
但是,目前對界面變化的判斷方式存在一些缺陷。例如,在通過當(dāng)前activity來判斷界面變化時(shí),當(dāng)面對同一activity下多個(gè)framgent或者多個(gè)tab互相切換的UI則無法做出正確的判斷。在通過界面的UI路徑對比來判斷界面變化時(shí),在部分變化的界面上則可能導(dǎo)致大量重復(fù)的操作,甚至如果沒有仔細(xì)考慮細(xì)節(jié),則會(huì)出現(xiàn)UI界面遍歷的死循環(huán)。當(dāng)然,為了避免出現(xiàn)UI界面遍歷的死循環(huán),可以限定同一UI操作數(shù)的上限,但此種策略也難免導(dǎo)致疏漏。此外,在通過比較控件屬性來判斷界面變化時(shí),由于其采用的是將不同屬性的控件加入一個(gè)棧中,然后挨個(gè)操作執(zhí)行來進(jìn)行的界面變化的判斷,那么在不同activity下出現(xiàn)具有相同屬性的控件時(shí),對UI界面變化的判斷就會(huì)出現(xiàn)疏漏。因此,需要一種新的界面變化判斷方式來確定是否完成功能遍歷和界面遍歷。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的功能遍歷與界面遍歷方法和相應(yīng)的系統(tǒng)。
依據(jù)本發(fā)明的一個(gè)方面,提供了一種功能遍歷與界面遍歷方法,包括:
將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中;其中,一個(gè)視圖節(jié)點(diǎn)包含多個(gè)子視圖節(jié)點(diǎn),一個(gè)子視圖節(jié)點(diǎn)對應(yīng)一個(gè)視圖;
將所述視圖節(jié)點(diǎn)容器中每一個(gè)可操作的子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中;
在所述子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,將所述子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除;
在所述視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆被清空之后,將所述視圖節(jié)點(diǎn)容器從所述視圖節(jié)點(diǎn)容器堆中刪除;
在所述視圖節(jié)點(diǎn)容器堆被清空之后,視為完成一次功能遍歷與界面遍歷。
可選地,在將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中之前,還包括:判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
可選地,當(dāng)判斷出界面上出現(xiàn)多個(gè)新的視圖節(jié)點(diǎn)容器時(shí),在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
可選地,在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中的過程中,根據(jù)所出現(xiàn)的新的視圖節(jié)點(diǎn)容器的UI結(jié)構(gòu)路徑,將所述新的視圖節(jié)點(diǎn)容器中的UI結(jié)構(gòu)路徑層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
可選地,根據(jù)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性確定所述子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。
可選地,當(dāng)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),所述子視圖節(jié)點(diǎn)視為可操作;否則,所述子視圖節(jié)點(diǎn)視為不可操作。
根據(jù)本發(fā)明的另一方面,提供了一種功能遍歷與界面遍歷系統(tǒng),包括:
視圖節(jié)點(diǎn)容器加入單元,用于將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中;其中,一個(gè)視圖節(jié)點(diǎn)包含多個(gè)子視圖節(jié)點(diǎn),一個(gè)子視圖節(jié)點(diǎn)對應(yīng)一個(gè)視圖;
視圖節(jié)點(diǎn)加入單元,用于將所述視圖節(jié)點(diǎn)容器中每一個(gè)可操作的子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中;
視圖節(jié)點(diǎn)刪除單元,用于在所述子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,將所述子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除;
視圖節(jié)點(diǎn)容器刪除單元,用于在所述視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆被清空之后,將所述視圖節(jié)點(diǎn)容器從所述視圖節(jié)點(diǎn)容器堆中刪除;
遍歷完成單元,用于在所述視圖節(jié)點(diǎn)容器堆被清空之后,視為完成一次功能遍歷與界面遍歷。
可選地,還包括:第一判斷單元,用于在視圖節(jié)點(diǎn)容器加入單元將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中之前,判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
可選地,還包括:視圖節(jié)點(diǎn)容器確定單元,用于在所述第一判斷單元判斷出界面上出現(xiàn)多個(gè)新的視圖節(jié)點(diǎn)容器時(shí),在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
可選地,所述視圖節(jié)點(diǎn)容器確定單元在確定視圖節(jié)點(diǎn)容器的過程中,根據(jù)所出現(xiàn)的新的視圖節(jié)點(diǎn)容器的UI結(jié)構(gòu)路徑,將所述新的視圖節(jié)點(diǎn)容器中的UI結(jié)構(gòu)路徑層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
可選地,還包括:第二判斷單元,用于根據(jù)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性,判斷所述子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。
可選地,在所述第二判斷單元判斷所述子視圖節(jié)點(diǎn)是否為可操作的視圖節(jié)點(diǎn)的過程中,
當(dāng)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),所述子視圖節(jié)點(diǎn)視為可操作;否則,所述子視圖節(jié)點(diǎn)視為不可操作。
根據(jù)本發(fā)明的功能遍歷與界面遍歷方法,能夠有效地區(qū)分已經(jīng)被遍歷的UI控件和尚未得到遍歷的UI控件,進(jìn)而更好的支持更全面的自動(dòng)化的界面遍歷與功能遍歷。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說明
通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的功能遍歷與界面遍歷方法的流程圖;
圖2示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的功能遍歷與界面遍歷方法的流程圖;
圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的功能遍歷與界面遍歷系統(tǒng)的邏輯結(jié)構(gòu)框圖;
圖4示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的功能遍歷與界面遍歷系統(tǒng)的邏輯結(jié)構(gòu)框圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
參考圖1,該圖示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的功能遍歷與界面遍歷方法的主要流程,本實(shí)施例中的功能遍歷與界面遍歷方法主要包括如下步驟:
S110:將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中;其中,一個(gè)視圖節(jié)點(diǎn)包含多個(gè)子視圖節(jié)點(diǎn),一個(gè)子視圖節(jié)點(diǎn)對應(yīng)一個(gè)視圖。
Android在屏幕中控件的組織上,可以將各個(gè)視圖(控件)組成一個(gè)視圖組(ViewGroup),視圖組是一個(gè)包含了其他視圖的視圖。在android.view包中,ViewGroup繼承了View,因此它本身也具有View的特性,而視圖組主要的功能在于它可以包含其他視圖,作為其他視圖的容器。
也就是說,由于在Android中存在視圖對象和視圖組對象,因此,可以將視圖對象看作視圖節(jié)點(diǎn),而視圖組對象看作視圖節(jié)點(diǎn)容器。
此外,在Android的UI結(jié)構(gòu)體系中,一個(gè)UI界面可以包含一個(gè)視圖,而視圖組本身也是一個(gè)視圖,并且視圖組又可以包含若干個(gè)視圖,因此,根據(jù)Android的UI結(jié)構(gòu),可以將設(shè)備界面上的每一個(gè)視圖,包括measure、layout、draw等操作視為一個(gè)視圖節(jié)點(diǎn)容器,而將各操作所具有的各種屬性視為該視圖節(jié)點(diǎn)容器下的視圖節(jié)點(diǎn)。
例如,將layout視為一個(gè)視圖節(jié)點(diǎn)容器,將layout所具有的id、text、index、class、content-dese、clickable等屬性視為一個(gè)視圖節(jié)點(diǎn)。但需要說明的是,layout在作為視圖節(jié)點(diǎn)容器的同時(shí),其本身也是一個(gè)視圖節(jié)點(diǎn)。在本實(shí)施例中,每個(gè)視圖節(jié)點(diǎn)容器只負(fù)責(zé)管理本身以及本身直接包含的子視圖節(jié)點(diǎn),并且每一個(gè)子視圖節(jié)點(diǎn)都存儲(chǔ)著自己所在的視圖節(jié)點(diǎn)容器,即每個(gè)子視圖節(jié)點(diǎn)都存儲(chǔ)著自己在整個(gè)UI中的結(jié)構(gòu)路徑。
S120:將視圖節(jié)點(diǎn)容器中每一個(gè)可操作的子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中。
在Android的用戶界面部分,Button控件是最常用的控件之一,用戶可以通過點(diǎn)擊它來觸發(fā)一系列事件。在Android Button控件的xml文件屬性中有一個(gè)clickable屬性標(biāo)簽,該標(biāo)簽繼承自View的xml屬性,因此,其值必須是邏輯值(即true or false)。該標(biāo)簽的目的是設(shè)置某個(gè)button控件是否可以被點(diǎn)擊。
因此,在本實(shí)施例中,可以將某個(gè)Button控件看作是某個(gè)視圖節(jié)點(diǎn)容器下的子視圖節(jié)點(diǎn),根據(jù)該子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性確定子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。具體地,當(dāng)子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),該子視圖節(jié)點(diǎn)視為可操作;否則,該子視圖節(jié)點(diǎn)視為不可操作。即:當(dāng)某個(gè)子視圖節(jié)點(diǎn)的clickable為true時(shí),表示該子視圖節(jié)點(diǎn)可以被點(diǎn)擊,反之表示該子視圖節(jié)點(diǎn)不可被點(diǎn)擊;當(dāng)某個(gè)子視圖節(jié)點(diǎn)的long-clickable為true時(shí),表示該子視圖節(jié)點(diǎn)可以被長按,反之表示該子視圖節(jié)點(diǎn)不可被長按。S130:在子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,將子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除。
其中,相比于之前的通過將控件加入棧中進(jìn)行UI遍歷的方式,進(jìn)入棧中的控件必須遵循先進(jìn)后出的原則,即,先進(jìn)入棧中的控件被壓入棧底,最后的控件在棧頂,在遍歷時(shí),壓入棧頂?shù)目丶枰瘸鰲?,如此,便有可能?huì)使得遍歷出現(xiàn)問題,進(jìn)而導(dǎo)致遍歷失敗;而本發(fā)明通過將子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中,由于堆可以被看成是一棵樹,其沒有先進(jìn)后出的原則限制,只要某個(gè)子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,就可以將該子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除。因此,相對于棧,堆具有較大的自由度。
也就是說,在本實(shí)施例中,通過把被操作的子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除的方式能夠清楚的知道哪些子視圖節(jié)點(diǎn)已經(jīng)被操作,哪些子視圖節(jié)點(diǎn)沒有被操作,避免出現(xiàn)漏掉某個(gè)子視圖節(jié)點(diǎn)的問題,從而使得對界面變化的判斷更為準(zhǔn)確。
S140:在視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆被清空之后,將視圖節(jié)點(diǎn)容器從視圖節(jié)點(diǎn)容器堆中刪除。
在本實(shí)施例中,通過把清空視圖節(jié)點(diǎn)堆的視圖節(jié)點(diǎn)容器從對應(yīng)的視圖節(jié)點(diǎn)容器中刪除的方式能夠有效區(qū)分哪些控件已經(jīng)被遍歷,哪些控件沒有被遍歷,從而避免對界面變化的判斷出現(xiàn)疏漏。
S150:在視圖節(jié)點(diǎn)容器堆被清空之后,視為完成一次功能遍歷與界面遍歷。
作為示例,一個(gè)視圖組A下包括了視圖A1、A2和A3。因此,可以將視圖組A看作視圖節(jié)點(diǎn)容器A,視圖A1、A2和A3看作視圖節(jié)點(diǎn)容器A下的子視圖節(jié)點(diǎn)A1、A2和A3。
在利用本發(fā)明提供的方法進(jìn)行功能遍歷與界面遍歷時(shí),首先將視圖節(jié)點(diǎn)容器A加入到視圖節(jié)點(diǎn)容器堆中,然后判斷該視圖節(jié)點(diǎn)容器A中是否有可操作的子視圖節(jié)點(diǎn)。根據(jù)子視圖節(jié)點(diǎn)A1、A2、A3的clickable屬性發(fā)現(xiàn),子視圖節(jié)點(diǎn)A1、A2、A3可操作,將子視圖節(jié)點(diǎn)A1、A2、A3加入到視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆中。
在視圖節(jié)點(diǎn)容器A下的子視圖節(jié)點(diǎn)A1、A2和A3對應(yīng)的視圖被操作之后,將A1、A2和A3從視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆中刪除;在視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆被清空之后,將視圖節(jié)點(diǎn)容器A從視圖節(jié)點(diǎn)容器堆中刪除。由于此時(shí),視圖節(jié)點(diǎn)容器堆中只包含了視圖節(jié)點(diǎn)容器A,因此,當(dāng)視圖節(jié)點(diǎn)容器A被刪除之后,視圖節(jié)點(diǎn)容器堆已經(jīng)為空了,此時(shí),即視為同時(shí)完成了一次功能遍歷與界面遍歷。
進(jìn)一步地,參考圖2,該圖示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的功能遍歷與界面遍歷方法的流程,本實(shí)施例中的功能遍歷與界面遍歷方法包括:
S210:判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
由于可以將界面上的每一個(gè)視圖視為一個(gè)視圖節(jié)點(diǎn),由若干個(gè)視圖節(jié)點(diǎn)組成一個(gè)視圖節(jié)點(diǎn)容器,并且每個(gè)視圖節(jié)點(diǎn)容器只負(fù)責(zé)管理本身以及本身直接包含的子視圖節(jié)點(diǎn),因此,在每一次操作變化之后,就可以將界面變化的判斷重心從UI界面脫離,轉(zhuǎn)而判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
S220:當(dāng)出現(xiàn)多個(gè)視圖節(jié)點(diǎn)容器時(shí),將UI結(jié)構(gòu)層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中,并將視圖節(jié)點(diǎn)容器中的每一個(gè)可操作的視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器堆的視圖節(jié)點(diǎn)堆中。
在本實(shí)施例中,如果發(fā)現(xiàn)了多個(gè)視圖節(jié)點(diǎn)容器,那么就找出其中UI結(jié)構(gòu)層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中,并且對于每一個(gè)新加入視圖節(jié)點(diǎn)容器堆中的視圖節(jié)點(diǎn)容器,會(huì)將其中每一個(gè)可操作的視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器堆的視圖節(jié)點(diǎn)堆中去。
例如,同時(shí)出現(xiàn)了視圖組A、視圖組B和視圖組C,則經(jīng)過對視圖組A、B、C的UI結(jié)構(gòu)層級的判斷發(fā)現(xiàn),視圖組B和C屬于視圖組A下的子視圖,此時(shí),則將視圖組A加入到視圖節(jié)點(diǎn)容器堆中去。
S230:當(dāng)一個(gè)視圖節(jié)點(diǎn)對應(yīng)的視圖被操作以后,從視圖節(jié)點(diǎn)堆中刪除對應(yīng)的視圖節(jié)點(diǎn),當(dāng)一個(gè)視圖節(jié)點(diǎn)堆被清空之后,從視圖節(jié)點(diǎn)容器堆中刪除一個(gè)視圖節(jié)點(diǎn)容器。
S240:當(dāng)視圖節(jié)點(diǎn)容器堆被清空之后,視為完成了一次功能遍歷和界面遍歷。
作為本發(fā)明的另一個(gè)示例,一個(gè)視圖組A下包括了視圖組A1以及視圖A2、A3,視圖組A1下包括了三個(gè)視圖A11、A12和A13。即此時(shí),會(huì)判斷出界面上出再現(xiàn)了兩個(gè)視圖節(jié)點(diǎn)容器,即:視圖節(jié)點(diǎn)容器A和視圖節(jié)點(diǎn)容器A1,而通過對視圖節(jié)點(diǎn)容器A和視圖節(jié)點(diǎn)容器A1的UI結(jié)構(gòu)層級的分析發(fā)現(xiàn),視圖節(jié)點(diǎn)容器A的結(jié)構(gòu)層級最高,因此,可以將視圖組A1以及視圖A2、A3看作視圖節(jié)點(diǎn)容器A下的子視圖節(jié)點(diǎn)A1、A2和A3。
在利用本發(fā)明提供的方法進(jìn)行功能遍歷與界面遍歷時(shí),首先將視圖節(jié)點(diǎn)容器A加入到視圖節(jié)點(diǎn)容器堆中,然后判斷該視圖節(jié)點(diǎn)容器A中是否有可操作的子視圖節(jié)點(diǎn)。根據(jù)子視圖節(jié)點(diǎn)A1、A2、A3的clickable屬性發(fā)現(xiàn),子視圖節(jié)點(diǎn)A1、A2、A3可操作,將子視圖節(jié)點(diǎn)A1、A2、A3加入到視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆中。
此外,在判斷視圖節(jié)點(diǎn)容器A中是否有可操作的子視圖節(jié)點(diǎn)時(shí),發(fā)現(xiàn)子視圖節(jié)點(diǎn)A1下還有子視圖節(jié)點(diǎn),此時(shí),則將子視圖節(jié)點(diǎn)A1看作子視圖節(jié)點(diǎn)容器A1,將A11、A12和A13則看作子視圖節(jié)點(diǎn)A1下的子視圖節(jié)點(diǎn)。
判斷子視圖節(jié)點(diǎn)容器A1下是否有可操作的子視圖節(jié)點(diǎn),同樣根據(jù)A11、A12和A13的clickable屬性來判斷,通過判斷,A11、A12和A13均可操作,此時(shí),將A11、A12和A13加入到子視圖節(jié)點(diǎn)容器A1的視圖節(jié)點(diǎn)堆中,當(dāng)A11、A12和A13對應(yīng)的視圖被操作之后,將A11、A12和A3從子視圖節(jié)點(diǎn)容器A1的視圖節(jié)點(diǎn)堆中刪除,當(dāng)A11、A12和A13均被刪除之后,將A1從視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆中刪除。
在A2和A3對應(yīng)的視圖被操作之后,將A2和A3從視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆中刪除,在視圖節(jié)點(diǎn)容器A的視圖節(jié)點(diǎn)堆被清空之后,將視圖節(jié)點(diǎn)容器A從視圖節(jié)點(diǎn)容器堆中刪除。同樣,由于此時(shí),視圖節(jié)點(diǎn)容器堆中只包含了視圖節(jié)點(diǎn)容器A,因此,當(dāng)視圖節(jié)點(diǎn)容器A被刪除之后,視圖節(jié)點(diǎn)容器堆已經(jīng)為空了,此時(shí),即視為同時(shí)完成了一次功能遍歷與界面遍歷。
綜上,利用本發(fā)明提供的功能遍歷與界面遍歷方法,通過引入視圖節(jié)點(diǎn)和視圖節(jié)點(diǎn)容器概念,從而能夠有效的區(qū)分已經(jīng)被遍歷的UI控件和尚未得到遍歷的UI控件,進(jìn)而更好的支持更全面的自動(dòng)化界面遍歷與功能遍歷。
下面說明本發(fā)明的另一方面。
參考圖3,該圖示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的功能遍歷與界面遍歷系統(tǒng)的邏輯結(jié)構(gòu)。本實(shí)施例中的功能遍歷與界面遍歷系統(tǒng)主要包括:
視圖節(jié)點(diǎn)容器加入單元310,本實(shí)施例中的視圖節(jié)點(diǎn)容器加入單元310主要用于將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中;其中,一個(gè)視圖節(jié)點(diǎn)包含多個(gè)子視圖節(jié)點(diǎn),一個(gè)子視圖節(jié)點(diǎn)對應(yīng)一個(gè)視圖。
參考前述,Android在屏幕中控件的組織上,可以將各個(gè)視圖(控件)組成一個(gè)視圖組(ViewGroup),視圖組是一個(gè)包含了其他視圖的視圖。在android.view包中,ViewGroup繼承了View,因此它本身也具有View的特性,而視圖組主要的功能在于它可以包含其他視圖,作為其他視圖的容器。
也就是說,由于在Android中存在視圖對象和視圖組對象,因此,可以將視圖對象看作視圖節(jié)點(diǎn),而視圖組對象看作視圖節(jié)點(diǎn)容器。
此外,在Android的UI結(jié)構(gòu)體系中,一個(gè)UI界面可以包含一個(gè)視圖,而視圖組本身也是一個(gè)視圖,并且視圖組又可以包含若干個(gè)視圖,因此,根據(jù)Android的UI結(jié)構(gòu),可以將設(shè)備界面上的每一個(gè)視圖,包括measure、layout、draw等操作視為一個(gè)視圖節(jié)點(diǎn)容器,而將各操作所具有的各種屬性視為該視圖節(jié)點(diǎn)容器下的視圖節(jié)點(diǎn)。
例如,將layout視為一個(gè)視圖節(jié)點(diǎn)容器,將layout所具有的id、text、index、class、content-desc、clickable等屬性視為一個(gè)視圖節(jié)點(diǎn)。但需要說明的是,layout在作為視圖節(jié)點(diǎn)容器的同時(shí),其本身也是一個(gè)視圖節(jié)點(diǎn)。在本實(shí)施例中,每個(gè)視圖節(jié)點(diǎn)容器只負(fù)責(zé)管理本身以及本身直接包含的子視圖節(jié)點(diǎn),并且每一個(gè)子視圖節(jié)點(diǎn)都存儲(chǔ)著自己所在的視圖節(jié)點(diǎn)容器,即每個(gè)子視圖節(jié)點(diǎn)都存儲(chǔ)著自己在整個(gè)UI中的結(jié)構(gòu)路徑。
視圖節(jié)點(diǎn)加入單元320,本實(shí)施例中的視圖節(jié)點(diǎn)加入單元320主要用于將視圖節(jié)點(diǎn)容器中每一個(gè)可操作的子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中。
同樣參考前述,在Android的用戶界面部分,Button控件是最常用的控件之一,用戶可以通過點(diǎn)擊它來觸發(fā)一系列事件。在Android Button控件的xml文件屬性中有一個(gè)clickable屬性標(biāo)簽,該標(biāo)簽繼承自View的xml屬性,因此,其值必須是邏輯值(即true or false)。該標(biāo)簽的目的是設(shè)置某個(gè)button控件是否可以被點(diǎn)擊。
因此,在本實(shí)施例中,可以將某個(gè)Button控件看作是某個(gè)視圖節(jié)點(diǎn)容器下的子視圖節(jié)點(diǎn),根據(jù)該子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性確定子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。具體地,當(dāng)子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),該子視圖節(jié)點(diǎn)視為可操作;否則,該子視圖節(jié)點(diǎn)視為不可操作。即:當(dāng)某個(gè)子視圖節(jié)點(diǎn)的clickable為true時(shí),表示該子視圖節(jié)點(diǎn)可以被點(diǎn)擊,反之表示該子視圖節(jié)點(diǎn)不可被點(diǎn)擊;當(dāng)某個(gè)子視圖節(jié)點(diǎn)的long-clickable為true時(shí),表示該子視圖節(jié)點(diǎn)可以被長按,反之表示該子視圖節(jié)點(diǎn)不可被長按。
視圖節(jié)點(diǎn)刪除單元330,本實(shí)施例中的視圖節(jié)點(diǎn)刪除單元330主要用于在子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,將子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除。
相比于之前的通過將控件加入棧中進(jìn)行UI遍歷的方式,進(jìn)入棧中的控件必須遵循先進(jìn)后出的原則,即,先進(jìn)入棧中的控件被壓入棧底,最后的控件在棧頂,在遍歷時(shí),壓入棧頂?shù)目丶枰瘸鰲?,如此,便有可能?huì)使得遍歷出現(xiàn)問題,進(jìn)而導(dǎo)致遍歷失?。欢景l(fā)明通過將子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中,由于堆可以被看成是一棵樹,其沒有先進(jìn)后出的原則限制,只要某個(gè)子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,就可以將該子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除。因此,相對于棧,堆具有較大的自由度。
也就是說,在本實(shí)施例中,通過把被操作的子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除的方式能夠清楚的知道哪些子視圖節(jié)點(diǎn)已經(jīng)被操作,哪些子視圖節(jié)點(diǎn)沒有被操作,避免出現(xiàn)漏掉某個(gè)子視圖節(jié)點(diǎn)的問題,從而使得對界面變化的判斷更為準(zhǔn)確。
視圖節(jié)點(diǎn)容器刪除單元340,本實(shí)施例中的視圖節(jié)點(diǎn)容器刪除單元340主要用于在視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆被清空之后,將視圖節(jié)點(diǎn)容器從視圖節(jié)點(diǎn)容器堆中刪除。
遍歷完成單元350,本實(shí)施例中的遍歷完成單元350主要用于在視圖節(jié)點(diǎn)容器堆被清空之后,視為完成一次功能遍歷與界面遍歷。
進(jìn)一步地,參考圖4,該圖示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的功能遍歷與界面遍歷系統(tǒng)的邏輯結(jié)構(gòu)。
圖4結(jié)合圖3,在本實(shí)施例中,在視圖節(jié)點(diǎn)容器加入單元310將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中之前,還包括:
第一判斷單元301,在本實(shí)施例中,第一判斷單元301主要用于判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
視圖節(jié)點(diǎn)容器確定單元302,在本實(shí)施例中,視圖節(jié)點(diǎn)容器確定單元302主要用于在第一判斷單元301判斷出界面上出現(xiàn)多個(gè)新的視圖節(jié)點(diǎn)容器時(shí),在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中。
在本實(shí)施例中,視圖節(jié)點(diǎn)容器確定單元302在確定視圖節(jié)點(diǎn)容器的過程中,根據(jù)所出現(xiàn)的新的視圖節(jié)點(diǎn)容器的UI結(jié)構(gòu)路徑,將所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中的UI結(jié)構(gòu)路徑層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中。
第二判斷單元311,在本實(shí)施例中,第二判斷單元311主要用于根據(jù)子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性,判斷子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。其中,當(dāng)子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),該子視圖節(jié)點(diǎn)視為可操作;否則,該子視圖節(jié)點(diǎn)視為不可操作。
參考前述,由于可以將界面上的每一個(gè)視圖視為一個(gè)視圖節(jié)點(diǎn),由若干個(gè)視圖節(jié)點(diǎn)組成一個(gè)視圖節(jié)點(diǎn)容器,并且每個(gè)視圖節(jié)點(diǎn)容器只負(fù)責(zé)管理本身以及本身直接包含的子視圖節(jié)點(diǎn),因此,在每一次操作變化之后,就可以將界面變化的判斷重心從UI界面脫離,轉(zhuǎn)而判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
當(dāng)出現(xiàn)了多個(gè)視圖節(jié)點(diǎn)容器時(shí),就找出其中UI結(jié)構(gòu)層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中,并且對于每一個(gè)新加入視圖節(jié)點(diǎn)容器堆中的視圖節(jié)點(diǎn)容器,會(huì)將其中每一個(gè)可操作的視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器堆的視圖節(jié)點(diǎn)堆中去。
當(dāng)一個(gè)視圖節(jié)點(diǎn)對應(yīng)的視圖被操作以后,從視圖節(jié)點(diǎn)堆中刪除對應(yīng)的視圖節(jié)點(diǎn),當(dāng)一個(gè)視圖節(jié)點(diǎn)堆被清空之后,從視圖節(jié)點(diǎn)容器堆中刪除一個(gè)視圖節(jié)點(diǎn)容器。當(dāng)視圖節(jié)點(diǎn)容器堆被清空之后,視為完成了一次功能遍歷和界面遍歷。
綜上,利用本發(fā)明提供的功能遍歷與界面遍歷系統(tǒng),能夠有效的區(qū)分已經(jīng)被遍歷的UI控件和尚未得到遍歷的UI控件,進(jìn)而更好的支持更全面的自動(dòng)化界面遍歷與功能遍歷。
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們設(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的實(shí)現(xiàn)提示窗展現(xiàn)廣告的系統(tǒng)中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對本發(fā)明進(jìn)行說明而不是對本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
本發(fā)明公開了,A1、一種功能遍歷與界面遍歷方法,包括:
將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中;其中,一個(gè)視圖節(jié)點(diǎn)包含多個(gè)子視圖節(jié)點(diǎn),一個(gè)子視圖節(jié)點(diǎn)對應(yīng)一個(gè)視圖;
將所述視圖節(jié)點(diǎn)容器中每一個(gè)可操作的子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中;
在所述子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,將所述子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除;
在所述視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆被清空之后,將所述視圖節(jié)點(diǎn)容器從所述視圖節(jié)點(diǎn)容器堆中刪除;
在所述視圖節(jié)點(diǎn)容器堆被清空之后,視為完成一次功能遍歷與界面遍歷。
A2、根據(jù)A1所述的方法,其特征在于,在將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中之前,還包括:
判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
A3、根據(jù)A2所述的方法,其特征在于,當(dāng)判斷出界面上出現(xiàn)多個(gè)新的視圖節(jié)點(diǎn)容器時(shí),在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
A4、根據(jù)A3所述的方法,其特征在于,在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中的過程中,
根據(jù)所出現(xiàn)的新的視圖節(jié)點(diǎn)容器的UI結(jié)構(gòu)路徑,將所述新的視圖節(jié)點(diǎn)容器中的UI結(jié)構(gòu)路徑層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
A5、根據(jù)A1所述的方法,其特征在于,根據(jù)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性確定所述子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。
A6、根據(jù)A5所述的方法,其特征在于,當(dāng)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),所述子視圖節(jié)點(diǎn)視為可操作;否則,
所述子視圖節(jié)點(diǎn)視為不可操作。
B7、一種功能遍歷與界面遍歷系統(tǒng),包括:
視圖節(jié)點(diǎn)容器加入單元,用于將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中;其中,一個(gè)視圖節(jié)點(diǎn)包含多個(gè)子視圖節(jié)點(diǎn),一個(gè)子視圖節(jié)點(diǎn)對應(yīng)一個(gè)視圖;
視圖節(jié)點(diǎn)加入單元,用于將所述視圖節(jié)點(diǎn)容器中每一個(gè)可操作的子視圖節(jié)點(diǎn)加入到對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中;
視圖節(jié)點(diǎn)刪除單元,用于在所述子視圖節(jié)點(diǎn)對應(yīng)的視圖被操作之后,將所述子視圖節(jié)點(diǎn)從對應(yīng)的視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆中刪除;
視圖節(jié)點(diǎn)容器刪除單元,用于在所述視圖節(jié)點(diǎn)容器的視圖節(jié)點(diǎn)堆被清空之后,將所述視圖節(jié)點(diǎn)容器從所述視圖節(jié)點(diǎn)容器堆中刪除;
遍歷完成單元,用于在所述視圖節(jié)點(diǎn)容器堆被清空之后,視為完成一次功能遍歷與界面遍歷。
B8、根據(jù)B7所述的系統(tǒng),其特征在于,還包括:
第一判斷單元,用于在視圖節(jié)點(diǎn)容器加入單元將界面上出現(xiàn)的新的視圖節(jié)點(diǎn)容器加入到視圖節(jié)點(diǎn)容器堆中之前,判斷界面上是否出現(xiàn)了新的視圖節(jié)點(diǎn)容器。
B9、根據(jù)B8所述的系統(tǒng),其特征在于,還包括:
視圖節(jié)點(diǎn)容器確定單元,用于在所述第一判斷單元判斷出界面上出現(xiàn)多個(gè)新的視圖節(jié)點(diǎn)容器時(shí),在所出現(xiàn)的新的視圖節(jié)點(diǎn)容器中確定一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
B10、根據(jù)B9所述的系統(tǒng),其特征在于,所述視圖節(jié)點(diǎn)容器確定單元在確定視圖節(jié)點(diǎn)容器的過程中,
根據(jù)所出現(xiàn)的新的視圖節(jié)點(diǎn)容器的UI結(jié)構(gòu)路徑,將所述新的視圖節(jié)點(diǎn)容器中的UI結(jié)構(gòu)路徑層級最高的一個(gè)視圖節(jié)點(diǎn)容器加入到所述視圖節(jié)點(diǎn)容器堆中。
B11、根據(jù)B7所述的系統(tǒng),其特征在于,還包括:
第二判斷單元,用于根據(jù)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性,判斷所述子視圖節(jié)點(diǎn)是否為可操作的子視圖節(jié)點(diǎn)。
B12、根據(jù)B11所述的系統(tǒng),其特征在于,在所述第二判斷單元判斷所述子視圖節(jié)點(diǎn)是否為可操作的視圖節(jié)點(diǎn)的過程中,
當(dāng)所述子視圖節(jié)點(diǎn)的clickable或者long-clickable屬性為true時(shí),所述子視圖節(jié)點(diǎn)視為可操作;否則,
所述子視圖節(jié)點(diǎn)視為不可操作。