本發(fā)明涉及互聯(lián)網(wǎng)程序開(kāi)發(fā)領(lǐng)域,具體涉及一種添加控件標(biāo)識(shí)的方法和裝置。
背景技術(shù):
隨著手機(jī)移動(dòng)端的快速發(fā)展,移動(dòng)端app的需求多種多樣。在app功能測(cè)試中,對(duì)于一些固定的用例執(zhí)行,可以使用自動(dòng)化測(cè)試工具,通過(guò)編寫(xiě)自動(dòng)化測(cè)試腳本來(lái)執(zhí)行,減少人員的重復(fù)勞動(dòng),提高整個(gè)測(cè)試的效率。
在通過(guò)腳本對(duì)移動(dòng)端的app進(jìn)行測(cè)試中,需要通過(guò)控件的xpath獲取每個(gè)控件的標(biāo)識(shí)來(lái)對(duì)控件進(jìn)行定位。但是在實(shí)際操作過(guò)程中,常常出現(xiàn)控件標(biāo)識(shí)重復(fù)或者沒(méi)有控件標(biāo)識(shí)的問(wèn)題,并且xpath獲取的是控件的相對(duì)路徑,不容易固定。因此使用xpath來(lái)定位控件,控件的路徑很容易變化。
為了解決上述問(wèn)題,現(xiàn)有技術(shù)中需要通過(guò)開(kāi)發(fā)人員為每個(gè)控件手動(dòng)添加標(biāo)識(shí),但這種方法需要耗費(fèi)大量的時(shí)間。特別是已經(jīng)開(kāi)發(fā)了幾年項(xiàng)目,其中控件的數(shù)量成千上萬(wàn),一個(gè)個(gè)手動(dòng)添加標(biāo)識(shí)需要耗時(shí)耗力,浪費(fèi)大量的人力資源,而且很容易造成標(biāo)識(shí)遺漏,效率低下。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中存在的耗時(shí)耗力、效率低下和易于遺漏的缺陷,本發(fā)明提供一種添加控件標(biāo)識(shí)的方法和裝置。
本發(fā)明的一方面提供一種添加控件標(biāo)識(shí)的方法,包括:s1,判斷能否使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí);s2,對(duì)于不能使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)的所述控件,若獲取到所述控件的點(diǎn)擊事件的方法名,則將所述方法名作為所述控件的標(biāo)識(shí);若不能獲取到所述控件的點(diǎn)擊事件的方法名,則將所述控件對(duì)應(yīng)的字符串作為所述控件的標(biāo)識(shí)。
其中,步驟s1中所述使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí)進(jìn)一步包括:若能獲取所述控件的屬性值,則將所述屬性值作為所述控件的標(biāo)識(shí);若不能獲取所述控件的屬性值,則根據(jù)所述控件的類(lèi)型,將所述控件的圖片名或文字作為所述控件的標(biāo)識(shí)。
其中,所述控件的類(lèi)型包括按鈕類(lèi)型和標(biāo)簽類(lèi)型。
其中,所述控件對(duì)應(yīng)的字符串是指所述控件的控件類(lèi)型名和父控件類(lèi)型名拼接成的字符串。
其中,所述獲取到所述控件的點(diǎn)擊事件的方法名包括:通過(guò)方法交換獲取所述控件的點(diǎn)擊事件的方法名;通過(guò)分類(lèi)中添加方法保存所述控件的點(diǎn)擊事件的方法名。
其中,所述將所述方法名作為所述控件的標(biāo)識(shí)包括:通過(guò)分類(lèi)中添加方法獲取所述控件的點(diǎn)擊事件的方法名;通過(guò)方法交換將所述方法名作為所述控件的標(biāo)識(shí)。
其中,所述方法交換包括:在所述控件對(duì)應(yīng)的類(lèi)啟動(dòng)時(shí)的加載方法中,控制所述方法交換只執(zhí)行一次;獲取原方法和待交換方法,并對(duì)所述原方法和所述待交換方法進(jìn)行交換。
其中,所述分類(lèi)中添加方法包括:創(chuàng)建分類(lèi),并在所述分類(lèi)中添加賦值方法set或獲取值方法get。
本發(fā)明的另一方面提供一種添加控件標(biāo)識(shí)的裝置,包括:判斷模塊,用于判斷能否使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí);標(biāo)識(shí)模塊,用于對(duì)于不能使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)的所述控件,若獲取到所述控件的點(diǎn)擊事件的方法名,則將所述方法名作為所述控件的標(biāo)識(shí);若不能獲取到所述控件的點(diǎn)擊事件的方法名,則將所述控件對(duì)應(yīng)的字符串作為所述控件的標(biāo)識(shí)。
其中,標(biāo)識(shí)模塊中所述使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí)進(jìn)一步包括:若能獲取所述控件的屬性值,則將所述屬性值作為所述控件的標(biāo)識(shí);若不能獲取所述控件的屬性值,則根據(jù)所述控件的類(lèi)型,將所述控件的圖片名或文字作為所述控件的標(biāo)識(shí)。
本發(fā)明提供的添加控件標(biāo)識(shí)的方法和裝置,通過(guò)將點(diǎn)擊事件的方法名或字符串作為控件的標(biāo)識(shí),能夠快捷、高效地為控件添加標(biāo)識(shí),能最大程度的使得在同一頁(yè)面中的多個(gè)控件的標(biāo)識(shí)不重復(fù),滿足了應(yīng)用程序在進(jìn)行腳本測(cè)試時(shí)的需求。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的方法的流程示意圖;
圖2為本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
為了方便理解,本發(fā)明實(shí)施例提供的方法和裝置中以ios系統(tǒng)為例進(jìn)行說(shuō)明,但本發(fā)明實(shí)施例的保護(hù)范圍不限于此。
圖1為本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的方法的流程示意圖,如圖1所示,該方法包括:s1,判斷能否使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí);s2,對(duì)于不能使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)的所述控件,若獲取到所述控件的點(diǎn)擊事件的方法名,則將所述方法名作為所述控件的標(biāo)識(shí);若不能獲取到所述控件的點(diǎn)擊事件的方法名,則將所述控件對(duì)應(yīng)的字符串作為所述控件的標(biāo)識(shí)。
在步驟s1中,首先可以判斷能否使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí)。如果可以,則使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)。
在步驟s2中,控件接收到點(diǎn)擊事件后可以執(zhí)行一個(gè)相應(yīng)的方法。因此,可以攔截系統(tǒng)的點(diǎn)擊事件,并獲取每個(gè)點(diǎn)擊事件的方法名。在獲取點(diǎn)擊事件的方法名之后,將點(diǎn)擊事件的方法名保存起來(lái)。對(duì)于那些不能使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)的控件,可以將該控件對(duì)應(yīng)的點(diǎn)擊事件的方法名作為該控件的標(biāo)識(shí)。
由于不是所有控件都能夠被點(diǎn)擊,因此如果該控件既不能根據(jù)預(yù)設(shè)方法進(jìn)行標(biāo)識(shí),也不能獲取到該控件的點(diǎn)擊事件的方法名,則可以將該控件對(duì)應(yīng)的字符串作為該控件的標(biāo)識(shí)。
本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的方法,通過(guò)將點(diǎn)擊事件的方法名或字符串作為控件的標(biāo)識(shí),能夠快捷、高效地為控件添加標(biāo)識(shí),能最大程度的使得在同一頁(yè)面中的多個(gè)控件的標(biāo)識(shí)不重復(fù),滿足了應(yīng)用程序在進(jìn)行腳本測(cè)試時(shí)的需求。
基于上述實(shí)施例,步驟s1中所述使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí)進(jìn)一步包括:若能獲取所述控件的屬性值,則將所述屬性值作為所述控件的標(biāo)識(shí);若不能獲取所述控件的屬性值,則根據(jù)所述控件的類(lèi)型,將所述控件的圖片名或文字作為所述控件的標(biāo)識(shí)。
由于大部分控件不是臨時(shí)變量,因此控件在ios的頁(yè)面中都有一個(gè)屬性值,該屬性值如同每個(gè)控件的名字,通常情況下不會(huì)變化,并且在同一頁(yè)面中也不允許重復(fù)。因此,通過(guò)使用控件的屬性值,能夠?qū)Υ蟛糠挚丶M(jìn)行標(biāo)識(shí)。
具體地,在預(yù)設(shè)方法中,首先嘗試獲取控件的屬性值,如果能夠獲取到控件的屬性值,則將該屬性值作為控件的標(biāo)識(shí)。例如在ios系統(tǒng)中,可以通過(guò)運(yùn)行時(shí)機(jī)制獲取這個(gè)屬性值。如果不能獲取控件的屬性值,則可以根據(jù)控件的類(lèi)型,將控件的圖片名或文字作為標(biāo)識(shí)。
基于上述實(shí)施例,其中,所述控件的類(lèi)型包括按鈕類(lèi)型和標(biāo)簽類(lèi)型。如果該控件的類(lèi)型為按鈕類(lèi)型,即uibutton類(lèi)型。則首先可以判斷該控件中是否有圖片,如果有圖片,則可以將該圖片的名字作為該控件的標(biāo)識(shí)。由于圖片的名字在整個(gè)界面中的唯一性較好,因此能夠避免重復(fù);如果該控件沒(méi)有圖片,則進(jìn)一步判斷該控件是否有文字,如果有文字,則將該文字作為該控件的標(biāo)識(shí)。由于按鈕類(lèi)型的文字通常比較固定且在同一頁(yè)面中的重復(fù)性較低,因此同樣具有較好的唯一性。
相似地,若判斷該控件類(lèi)型為標(biāo)簽類(lèi)型,即uilable類(lèi)型,則可以將該控件內(nèi)標(biāo)簽的文字作為控件的標(biāo)識(shí)。通過(guò)根據(jù)控件的類(lèi)型進(jìn)行不同的標(biāo)識(shí)操作,能夠結(jié)合控件類(lèi)型的特點(diǎn)為進(jìn)行控件標(biāo)識(shí),具有較好的唯一性。
基于上述實(shí)施例,其中,所述控件對(duì)應(yīng)的字符串是指所述控件的控件類(lèi)型名和父控件類(lèi)型名拼接成的字符串。具體地,可以將該控件的控件類(lèi)型名和父控件的類(lèi)型名拼接成一個(gè)字符串作為該控件的標(biāo)識(shí)。從而最大程度地保證每個(gè)控件都具有標(biāo)識(shí),不會(huì)遺漏。
基于上述實(shí)施例,所述獲取到所述控件的點(diǎn)擊事件的方法名包括:通過(guò)方法交換獲取所述控件的點(diǎn)擊事件的方法名;通過(guò)分類(lèi)中添加方法保存所述控件的點(diǎn)擊事件的方法名。
具體地,可以通過(guò)ios系統(tǒng)中的運(yùn)行時(shí)機(jī)制的方法交換,將系統(tǒng)中的響應(yīng)點(diǎn)擊時(shí)間的函數(shù)替換成函數(shù)addtarget:action:forcontrolevents,該函數(shù)能夠攔截系統(tǒng)的點(diǎn)擊時(shí)間,從而獲取每個(gè)點(diǎn)擊事件的方法名。
而為了實(shí)現(xiàn)新增加的需求,objective-c提供了一種特別的方式來(lái)擴(kuò)展類(lèi),叫catagory,可以動(dòng)態(tài)的為已經(jīng)存在的類(lèi)添加新的行為。這樣可以保證類(lèi)在原來(lái)的基礎(chǔ)上,通過(guò)較小的改動(dòng)就可以增加需要的功能。
因此可以在分類(lèi)里添加一個(gè)賦值set方法,在該set方法中通過(guò)使用函數(shù)objc_setassociatedobject來(lái)保存控件的點(diǎn)擊事件的方法名。其中,該函數(shù)具有兩個(gè)參數(shù),自己self和字符串key。
基于上述實(shí)施例,其中,所述將所述方法名作為所述控件的標(biāo)識(shí)包括:通過(guò)分類(lèi)中添加方法獲取所述控件的點(diǎn)擊事件的方法名;通過(guò)方法交換將所述方法名作為所述控件的標(biāo)識(shí)。
具體地,為了將上述set方法保存的點(diǎn)擊事件的方法名取出,與set方法類(lèi)似,可以在分類(lèi)里使用ios系統(tǒng)的運(yùn)行時(shí)機(jī)制生成一個(gè)獲取值方法get。其中,獲取值方法get是通過(guò)使用ios設(shè)置關(guān)聯(lián)對(duì)象的方法,具體的函數(shù)為objc_getassociatedobject,其具有兩個(gè)參數(shù),自己self和上述set方法中的字符串key。通過(guò)該get方法能夠獲取點(diǎn)擊事件的方法名。
在獲取到點(diǎn)擊事件的方法名后,可以通過(guò)ios系統(tǒng)中的運(yùn)行時(shí)機(jī)制的方法交換,將系統(tǒng)中的函數(shù)交換成(nsstring*)accessibilityidentifier,該函數(shù)能夠?qū)et方法獲取到的點(diǎn)擊事件的方法名對(duì)相應(yīng)的控件進(jìn)行標(biāo)識(shí)。相似地,函數(shù)(nsstring*)accessibilityidentifier也可以根據(jù)預(yù)設(shè)方法或控件對(duì)應(yīng)的字符串對(duì)作為控件的標(biāo)識(shí)。
基于上述實(shí)施例,其中,所述方法交換包括:在所述控件對(duì)應(yīng)的類(lèi)啟動(dòng)時(shí)的加載方法中,控制所述方法交換只執(zhí)行一次;獲取原方法和待交換方法,并對(duì)所述原方法和所述待交換方法進(jìn)行交換。
具體地,方法交換是在ios系統(tǒng)的一個(gè)控件的對(duì)應(yīng)類(lèi)啟動(dòng)時(shí)的加載方法中進(jìn)行。可以通過(guò)函數(shù)dispatch_once控制類(lèi)交換的方法只執(zhí)行一次,該函數(shù)可以包括兩個(gè)參數(shù),第一個(gè)參數(shù)predicate用來(lái)保證執(zhí)行一次,第二個(gè)參數(shù)是要執(zhí)行一次的任務(wù)block。
然后需要獲取到被交換的原方法為originalmethod(例如,事件響應(yīng)的方法、圖片加載的方法等方法),自定義一個(gè)需要交換的待交換方法swizzledmethod(既可以執(zhí)行系統(tǒng)方法的功能,又可以實(shí)現(xiàn)自定義的功能,例如添加控件標(biāo)示)。
通過(guò)ios的系統(tǒng)函數(shù)method_exchangeimplementations執(zhí)行方法交換,交換原方法originalmethod和待交換方法swizzledmethod,以此實(shí)現(xiàn)兩個(gè)函數(shù)的交換。
通過(guò)對(duì)ios系統(tǒng)的方法進(jìn)行交換,使得每個(gè)控件創(chuàng)建都會(huì)調(diào)用該方法,可以保證每個(gè)控件都會(huì)執(zhí)行方法交換,沒(méi)有任何遺漏。
基于上述實(shí)施例,其中,所述分類(lèi)中添加方法包括:創(chuàng)建分類(lèi),并在所述分類(lèi)中添加賦值方法set或獲取值方法get。
具體地,分類(lèi)是ios語(yǔ)言類(lèi)的屬性。首先可以在類(lèi)中創(chuàng)建一個(gè)分類(lèi),并在該分類(lèi)中添加方法??梢允褂胕os系統(tǒng)的運(yùn)行時(shí)機(jī)制生成賦值方法set和獲取值方法get。通過(guò)設(shè)置set方法和get方法讓ios系統(tǒng)中原本不能執(zhí)行賦值操作和獲取值操作變成了可以通過(guò)運(yùn)行時(shí)機(jī)制執(zhí)行賦值操作和獲取值操作。
圖2為本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的裝置的結(jié)構(gòu)示意圖,如圖2所示,該裝置包括:判斷模塊201,用于判斷能否使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí);標(biāo)識(shí)模塊202,用于對(duì)于不能使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)的所述控件,若獲取到所述控件的點(diǎn)擊事件的方法名,則將所述方法名作為所述控件的標(biāo)識(shí);若不能獲取到所述控件的點(diǎn)擊事件的方法名,則將所述控件對(duì)應(yīng)的字符串作為所述控件的標(biāo)識(shí)。
具體地,判斷模塊201可以判斷能否使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí)??丶邮盏近c(diǎn)擊事件后可以執(zhí)行一個(gè)相應(yīng)的方法。因此,標(biāo)識(shí)模塊202可以攔截系統(tǒng)的點(diǎn)擊事件,并獲取每個(gè)點(diǎn)擊事件的方法名。在獲取點(diǎn)擊事件的方法名之后,標(biāo)識(shí)模塊202將點(diǎn)擊事件的方法名保存起來(lái)。對(duì)于那些不能使用預(yù)設(shè)方法進(jìn)行標(biāo)識(shí)的控件,標(biāo)識(shí)模塊202可以將該控件對(duì)應(yīng)的點(diǎn)擊事件的方法名作為該控件的標(biāo)識(shí)。
由于不是所有控件都能夠被點(diǎn)擊,因此如果該控件既不能根據(jù)預(yù)設(shè)方法進(jìn)行標(biāo)識(shí),也不能獲取到該控件的點(diǎn)擊事件的方法名,則標(biāo)識(shí)模塊202可以將該控件對(duì)應(yīng)的字符串作為該控件的標(biāo)識(shí)。
本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的裝置,通過(guò)將點(diǎn)擊事件的方法名或字符串作為控件的標(biāo)識(shí),能夠快捷、高效地為控件添加標(biāo)識(shí),能最大程度的使得在同一頁(yè)面中的多個(gè)控件的標(biāo)識(shí)不重復(fù),滿足了應(yīng)用程序在進(jìn)行腳本測(cè)試時(shí)的需求。
基于上述實(shí)施例,其中,標(biāo)識(shí)模塊202中所述使用預(yù)設(shè)方法對(duì)控件進(jìn)行標(biāo)識(shí)進(jìn)一步包括:若能獲取所述控件的屬性值,則將所述屬性值作為所述控件的標(biāo)識(shí);若不能獲取所述控件的屬性值,則根據(jù)所述控件的類(lèi)型,將所述控件的圖片名或文字作為所述控件的標(biāo)識(shí)。
由于大部分控件不是臨時(shí)變量,因此控件在ios的頁(yè)面中都有一個(gè)屬性值,該屬性值如同每個(gè)控件的名字,通常情況下不會(huì)變化,并且在同一頁(yè)面中也不允許重復(fù)。因此,通過(guò)使用控件的屬性值,能夠?qū)Υ蟛糠挚丶M(jìn)行標(biāo)識(shí)。
具體地,在預(yù)設(shè)方法中,首先嘗試獲取控件的屬性值,如果能夠獲取到控件的屬性值,則將該屬性值作為控件的標(biāo)識(shí)。例如在ios系統(tǒng)中,可以通過(guò)運(yùn)行時(shí)機(jī)制獲取這個(gè)屬性值。如果不能獲取控件的屬性值,則可以根據(jù)控件的類(lèi)型,將控件的圖片名或文字作為標(biāo)識(shí)。
本發(fā)明實(shí)施例提供的添加控件標(biāo)識(shí)的方法和裝置,能夠通過(guò)使用控件的屬性名、圖片名、文字、點(diǎn)擊事件的方法名或控件對(duì)應(yīng)的字符串作為控件的標(biāo)識(shí),能在對(duì)app進(jìn)行腳本測(cè)試時(shí),自動(dòng)、高效、最大程度地為控件添加標(biāo)識(shí),降低了開(kāi)發(fā)人員的工作量,提高了工作效率。
最后應(yīng)說(shuō)明的是:以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。