- QTP自動化測試實踐
- 51Testing軟件測試網(wǎng)組編
- 6155字
- 2018-12-29 21:55:34
第3章 軟件自動化測試工具
軟件自動化測試工具是實現(xiàn)軟件自動化測試必不可少的關(guān)鍵,因此,選擇一個優(yōu)秀的、適合自己的測試項目實際情況的測試工具是實現(xiàn)成功自動化測試的第一步。本章介紹自動化測試工具的分類,以及如何選擇一個合適的自動化測試工具,并且介紹自動化測試工具的基本原理。
3.1 自動化測試工具類型
測試工具的種類很多,有用于管理測試的,有幫助實現(xiàn)測試自動化的,有開源的,有免費(fèi)共享的。軟件測試工具按照其用途,可大致分成以下幾大類:
? 測試管理工具
? 自動化功能測試工具
? 性能測試工具
? 單元測試工具。
? 白盒測試工具。
? 測試用例設(shè)計工具。
如果按測試工具的收費(fèi)方式,又可分為以下幾類。
? 商業(yè)測試工具。
? 開源測試工具。
? 免費(fèi)測試工具。
3.1.1 商業(yè)測試工具
商業(yè)測試工具的特點是需要花錢購買,但是會相對成熟和穩(wěn)定,并且有一定的售后服務(wù)和技術(shù)支持。但是,由于其價格昂貴,并不是每一個企業(yè)都能負(fù)擔(dān)得起。
商業(yè)測試工具主要集中在GUI功能測試和性能測試方面,目前流行的基于GUI的功能自動化測試工具有Robot、QTP、TestComplete等。各種自動化測試工具實現(xiàn)的功能基本相同,但是在IDE、腳本開發(fā)語言、支持的腳本開發(fā)方式、支持的控件等方面則有很多不同之處。
3.1.2 開源測試工具
開源軟件是指軟件的源代碼是公開發(fā)布的,通常是由自愿者開發(fā)和維護(hù)的軟件。開源測試工具是測試工具的一個重要分支。越來越多的軟件企業(yè)開始使用開源測試工具。但是開源并不意味著完全的免費(fèi),開源測試工具同樣需要考慮使用的成本,并且在某些方面可能要比商業(yè)測試工具的成本還要高。
商業(yè)工具的價格在不斷地提高。圖3.1為WinRunner近幾年的價格變化圖。

圖3.1 WinRunner近幾年的價格變化
可以看到,價格在不斷地增長。這對于那些中小型軟件企業(yè)而言,無疑加大了測試的成本。開源測試工具相對于商業(yè)測試工具擁有以下優(yōu)勢:
? 相對低的成本:大部分開源測試工具可免費(fèi)使用,只要不做商業(yè)用途即可。
? 更大的選擇余地:可以打破商業(yè)測試工具的壟斷地位,給測試人員更多的選擇空間。
? 可自己改造:源代碼開放,意味著可對其進(jìn)行修改、補(bǔ)充和完善,可對其進(jìn)行個性化改造。
雖然開源測試工具擁有一定的優(yōu)勢,但是,同時也存在很多不足之處,包括以下幾方面。
? 安裝和部署相對困難:大部分開源測試工具的安裝配置過程比較煩瑣,需要測試人員付出一定的努力。
? 易用性:開源測試工具在易用性、用戶體驗方面做得不夠完善。
? 穩(wěn)定性:部分開源測試工具的穩(wěn)定性不夠強(qiáng)。
? 學(xué)習(xí)和獲取技術(shù)支持的難度:大部分開源測試工具不提供培訓(xùn)指導(dǎo)和技術(shù)支持服務(wù),聯(lián)機(jī)幫助和用戶手冊不夠完善,增加了測試人員的學(xué)習(xí)難度。
3.1.3 自主開發(fā)測試工具
目前,很多軟件測試組織其實已經(jīng)具備了自己動手開發(fā)測試工具的條件:
? 市場對于測試工具的接受程度在不斷提高,人們對測試工具的認(rèn)識不斷加強(qiáng)和深入,對測試工具原理的理解不斷提高。從腳本化到數(shù)據(jù)驅(qū)動,再到關(guān)鍵字驅(qū)動等,很多新的測試工具理念被引入并被廣泛接受。
? 由于技術(shù)的成熟,測試工具變得容易構(gòu)建。軟件系統(tǒng)現(xiàn)在變得更容易測試,可測試性更強(qiáng),COM、XML、HTTP、HTML等標(biāo)準(zhǔn)化的接口使得測試更加容易進(jìn)行。托管程序(例如Java、.NET)的反射機(jī)制使得查找定位對象,以及捕捉對象和操作對象更加容易。
? 一些開源的框架可以被利用。利用開源框架平臺來組合、搭建適合自己測試項目使用的測試平臺和測試框架。
自己動手開發(fā)測試工具的優(yōu)勢有以下方面。
? 購買成本為零。
? 簡便:只需要開發(fā)自己需要的那部分功能。
? 個性化:可自己定制需要的功能,隨時修改,配置項目組成員的使用習(xí)慣。
? 可擴(kuò)展性:可隨時增加新的功能。
? 可充分利用項目組熟悉的語言開發(fā),利用自己的技術(shù)優(yōu)勢。
? 可使用自己熟悉的腳本語言,不需要使用商業(yè)工具提供的“廠商腳本語言”。
然而,雖然自己動手設(shè)計和開發(fā)測試工具有很多好處,但是必須考慮隨之而來的成本問題。自己開發(fā)測試工具的成本只是開發(fā)時間和人員投入的成本,以及維護(hù)的成本。當(dāng)然,如果把測試工具推廣到其他項目組,則也會有學(xué)習(xí)和培訓(xùn)成本。另外,需要考慮測試工具的實用性,不要做一個大而全的、面面俱到的、很多功能基本上不會被用到的測試工具。
3.2 自動化測試工具選型
為了保證在一個測試團(tuán)隊中成功地應(yīng)用某款測試工具,尤其是對于大型商業(yè)工具的應(yīng)用,應(yīng)該首先進(jìn)行工具的選型,通過分析實際情況,確定選用范圍。對選用范圍內(nèi)的幾款測試工具進(jìn)行試用。根據(jù)試用的反饋效果決定最終采用哪款測試工具。在大規(guī)模使用工具之前,還應(yīng)該對測試人員進(jìn)行全面的工具培訓(xùn)。培訓(xùn)后,正式在項目中應(yīng)用測試工具,制定相應(yīng)的測試工具使用策略,并把工具融入測試工作中。
3.2.1 測試工具評估
測試工具的選型是成功應(yīng)用測試工具的第一步,測試工具的選型應(yīng)該注意以下幾點:
(1)首先,分析項目的特點,軟件系統(tǒng)采用的開發(fā)工具、語言、技術(shù)、平臺等。還要結(jié)合測試的類型、測試的要求。
(2)同時還要了解目前存在的各種測試工具的情況,包括工具的生產(chǎn)廠家、價格、產(chǎn)品特性、技術(shù)支持和售后服務(wù)情況,還要了解該工具的市場占有率、使用人群等情況,如果是國外廠商生產(chǎn)的測試工具,最好再了解清楚國內(nèi)的代理機(jī)構(gòu)的情況等。
(3)選型的最后一步是編寫選型報告。通過綜合分析所有收集回來的材料,橫向比較測試工具的優(yōu)勢和劣勢。
3.2.2 測試工具試用
在初步選型后,可定出幾個滿足要求的測試工具,然后進(jìn)行深入的試用工作,應(yīng)該盡可能嘗試測試工具的所有功能,并且可能的話,要盡量在項目的軟件系統(tǒng)中嘗試。
需要制定一份詳細(xì)的測試工具的試用計劃,因為這可能是一項長時間的、需要謹(jǐn)慎進(jìn)行的工作,尤其是對于那些商業(yè)的測試工具,動輒上百萬的購置費(fèi)用。很多公司由于沒有謹(jǐn)慎進(jìn)行前期的選型和試用工作,導(dǎo)致購買的測試工具不適用,或者使用效果不理想,最后被測試人員扔在角落里。
注意
不要僅僅聽信測試工具銷售人員的介紹就輕易購買,一定要自己組織一次詳細(xì)的試用活動,確認(rèn)適合在項目中使用,才能購買。
3.2.3 自動化測試工具的培訓(xùn)
確定了選用的測試工具后,正式在測試項目中使用該測試工具之前,還需要組織相關(guān)測試人員進(jìn)行測試工具的培訓(xùn)。測試工具的培訓(xùn)可包括以下內(nèi)容。
(1)測試工具的總體介紹主要給測試人員講解測試工具包括哪些主要的功能和特性,可用于哪些方面的測試。
(2)測試工具操作方法介紹主要給測試人員講解測試工具的每一項功能的使用方法、操作步驟、注意事項等方面的內(nèi)容。一般可由工具廠商派遣的技術(shù)支持人員進(jìn)行,也可由熟悉該工具的測試人員來介紹,例如,負(fù)責(zé)前期測試工具試用的測試人員。
(3)測試工具使用實踐,則是結(jié)合某個具體的例子給測試人員演示測試工具的使用方法和使用經(jīng)驗等。一般可由負(fù)責(zé)該測試工具試用的測試人員進(jìn)行。
(4)對測試工具相關(guān)的測試?yán)碚撨M(jìn)行講解的目的是為了讓測試人員了解該測試工具的原理,以及工具所應(yīng)用的領(lǐng)域的相關(guān)理論知識,讓測試人員在理論知識的指導(dǎo)下能更好、更恰當(dāng)、更充分、更正確地使用測試工具。
技巧
測試工具的培訓(xùn)是成功引入測試工具的關(guān)鍵環(huán)節(jié),在正式使用測試工具之前,應(yīng)該確保測試人員充分掌握測試工具的基本使用方法,避免在使用過程中碰到很多工具操作和使用上的問題,導(dǎo)致測試進(jìn)度緩慢。
3.3 自動化測試工具的原理
測試工具的優(yōu)勢在于可部分地替代人工的測試過程,能重復(fù)不斷地執(zhí)行,能精確判斷數(shù)值和字符對象。自動化測試工具把測試用例用自動的方式執(zhí)行,例如,自動地產(chǎn)生數(shù)據(jù),自動地打開應(yīng)用程序,自動地查找控件,自動地輸入數(shù)據(jù),自動地操作控件,自動地收集測試結(jié)果,自動地與預(yù)期結(jié)果進(jìn)行比較等。
自動化功能測試工具可基于GUI層面進(jìn)行測試,也可基于代碼層面進(jìn)行測試。只要實現(xiàn)了自動化執(zhí)行測試用例,自動化地檢查測試數(shù)據(jù)的測試工具,替代人工進(jìn)行測試步驟的執(zhí)行,從而驗證應(yīng)用程序是否滿足了特定功能的測試工具,都可以稱為自動化功能測試工具。
3.3.1 基于代碼層面的功能自動化測試工具
基于代碼層面的功能自動化測試工具主要是一些單元測試工具,例如JUnit、NUnit、MSTest等,這些工具直接訪問被測試的應(yīng)用程序的代碼,對其中的類和函數(shù)進(jìn)行調(diào)用,輸入各種測試數(shù)據(jù),檢查函數(shù)的返回值,通過比較返回值與期待的值是否一致來判斷測試是否通過。圖3.2所示的是Visual Studio.NET 2005中的單元測試管理界面。

圖3.2 Visual Studio.NET 2005中的單元測試管理界面
這種類型的工具主要實現(xiàn)了測試代碼框架產(chǎn)生的自動化,例如,下面代碼是Visual Studio.NET 2005中的單元測試框架MSTest為某個類的方法自動產(chǎn)生的單元測試代碼框架:
// 以下代碼由 Microsoft Visual Studio 2005 生成。 // 測試所有者應(yīng)該檢查每個測試的有效性。 using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Text; using System.Collections.Generic; using AUT; namespace TestProject1 { /// <summary> ///這是 AUT.Form1 的測試類,旨在包含所有 AUT.Form1 單元測試 ///</summary> [TestClass()] public class Form1Test { private TestContext testContextInstance; /// <summary> ///獲取或設(shè)置測試上下文,上下文提供有關(guān)當(dāng)前測試運(yùn)行及其功能的信息。 ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } #region 附加測試屬性 // //編寫測試時,可使用以下附加屬性: // //使用 ClassInitialize 在運(yùn)行類中的第一個測試前先運(yùn)行代碼 // //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //使用 ClassCleanup 在運(yùn)行完類中的所有測試后再運(yùn)行代碼 // //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //使用 TestInitialize 在運(yùn)行每個測試前先運(yùn)行代碼 // //[TestInitialize()] //public void MyTestInitialize() //{ //} // //使用 TestCleanup 在運(yùn)行完每個測試后運(yùn)行代碼 // //[TestCleanup()] //public void MyTestCleanup() //{ //} // #endregion /// <summary> ///Add(int,int) 的測試 ///</summary> [DeploymentItem("AUT.exe")] [TestMethod()] public void AddTest() { Form1 target = new Form1(); TestProject1.AUT_Form1Accessor accessor = new TestProject1.AUT_Form1Accessor(target); int i=0;//TODO: 初始化為適當(dāng)?shù)闹? int j=0;//TODO: 初始化為適當(dāng)?shù)闹? int expected = 0; int actual; actual = accessor.Add(i, j); Assert.AreEqual(expected,actual,"AUT.Form1.Add 未返回所需的值。"); Assert.Inconclusive("驗證此測試方法的正確性。"); } } }
在代碼框架的背后,單元測試框架負(fù)責(zé)查找和調(diào)用被測試的類和方法,通過代碼反射機(jī)制可以訪問到被測試代碼中的所有方法和屬性。另外,單元測試框架會提供一系列的Assert類,使用這些Assert類可以簡化測試結(jié)果檢查、判斷的工具。
提示
在執(zhí)行單元測試時,單元測試框架負(fù)責(zé)加載包含測試類的程序集文件,通過查找里面的測試類和測試方法標(biāo)識來加載測試方法,例如,上面代碼中的“[TestMethod()]”就是用于標(biāo)識其中的測試方法。
3.3.2 基于瀏覽器和DOM對象模型的功能自動化測試工具
另外一種自動化的功能測試工具是基于瀏覽器和DOM對象模型開發(fā)的,例如Selenium、Watir等,這些測試工具直接訪問Web瀏覽器,利用腳本語言操縱瀏覽器和Web頁面中包含的DOM對象,從而達(dá)到模擬用戶控制瀏覽導(dǎo)航、頁面元素的操縱等效果,并且直接獲取DOM對象的屬性,從而獲得Web頁面元素的各種屬性,通過這些屬性可判斷測試步驟的結(jié)果是否正確。圖3.3所示的是可作為插件嵌入到Mozilla Firefox瀏覽器中的Selenium IDE的測試界面。

圖3.3 Selenium IDE的測試界面
HTML DOM(Document Object Model)是一個HTML文檔的編程接口,它定義了HTML的標(biāo)準(zhǔn)對象集合,并且定義了標(biāo)準(zhǔn)的訪問和操縱HTML對象的方式。HTML DOM接口讓測試人員可以訪問和操縱HTML文檔的內(nèi)容。圖3.4所示的界面是使用了一個名為“IE DOM Inspector”的工具查看到的Web頁面中的DOM對象。

圖3.4 IE DOM Inspector的界面
如果熟悉和了解DOM的原理,那么完全可以自己動手編寫一個基于瀏覽器和DOM的Web頁面自動化測試工具,例如,下面的C#代碼就是一個簡單的例子:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Threading; // 引用Microsoft.mshtml的HTML接口 using mshtml; // 引用IE對象 using SHDocVw; namespace WebAutomatedTest1 { public partial class Form1 : Form { static AutoResetEvent documentComplete = new AutoResetEvent(false); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { InternetExplorer ie = null; // 啟動IE的進(jìn)程 Process p = Process.Start("iexplore.exe", "about:blank"); // 等待一段時間,讓IE啟動 Thread.Sleep(3000); if (p == null) { MessageBox.Show("不能啟動IE!"); return; } SHDocVw.ShellWindows allBrowsers = new SHDocVw.ShellWindows(); // 附加到IE進(jìn)程 int i = 0; while (i < allBrowsers.Count && ie == null) { InternetExplorer browser = (InternetExplorer)allBrowsers.Item(i); if (browser.HWND == (int)p.MainWindowHandle) ie = browser; ++i; } if (ie == null) { MessageBox.Show("不能附加到IE!"); return; } ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete); object nil = new object(); ie.Navigate("http://127.0.0.1:9462/WebUT/default.aspx", documentComplete.WaitOne(); ref nil,ref nil,ref nil,ref nil); HTMLDocument Doc = (HTMLDocument)ie.Document; HTMLInputElement textBox = (HTMLInputElement)Doc.getElementById("TextBox1"); textBox.value = "123"; HTMLInputElement button = button.click(); (HTMLInputElement)Doc.getElementById("Button1"); // 驗證,如果Label1的值等于123,則表示測試通過 HTMLSpanElement label = (HTMLSpanElement)Doc.getElementById("Label1"); if (label.innerText == "123") { MessageBox.Show("測試通過!"); } else { MessageBox.Show("測試不通過!"); } } private static void ie_DocumentComplete(object pDisp, ref object URL) { documentComplete.Set(); } } }
3.3.3 基于GUI對象識別的測試工具原理
目前,大部分自動化功能測試工具,尤其是商業(yè)的測試工具,都是基于GUI對象識別技術(shù)來設(shè)計的。基于GUI層面的測試需要與各種界面元素打交道,而且不同的編程語言和開發(fā)工具開發(fā)的應(yīng)用程序在界面的表現(xiàn)、事件的響應(yīng)上都略有不同,因此,設(shè)計基于GUI層面的自動化功能測試工具會更為復(fù)雜些。
Windows的API中封裝了很多可用于自動化測試編程的函數(shù),例如FindWindow、GetWindowRect等函數(shù)。這些函數(shù)可在編程語言或腳本代碼中進(jìn)行調(diào)用,從而實現(xiàn)自動化測試編程。例如,下面的C#代碼封裝了user32.dll中的FindWindow函數(shù),實現(xiàn)查找指定類型和名稱的控件的功能:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace LowLevelGUITest { public class Automation { // 引入user32.dll中的FindWindow函數(shù) [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // 查找控件方法 public IntPtr FindControl(string ClassName,string ControlName) { // 返回控件句柄 return FindWindow(ClassName, ControlName); } } }
可用下面的C#代碼來調(diào)用這個封裝的函數(shù):
private void button1_Click(object sender, EventArgs e) { Automation automation = new Automation(); // 查找名為AUT的窗體 IntPtr p = automation.FindControl("WindowsForms10.Window.8.app.0.378734a","AUT"); // 判斷是否找到控件 if (p == IntPtr.Zero) { Console.WriteLine("找不到指定的控件!"); } }
如果想進(jìn)一步了解GUI對象識別的原理,可以打開Visual Studio.NET 2005自帶的Spy++,如圖3.5所示。

圖3.5 Spy++的界面
Spy++中的搜索查找控件功能就是這種對象識別原理的體現(xiàn)。例如,在圖3.6所示的界面中,可以看到某個指定的窗口的句柄、標(biāo)題、類。

圖3.6 Spy++中的搜索查找控件功能
3.3.4 反射機(jī)制在自動化功能測試工具中的使用
在基于GUI對象識別和控制的自動化測試工具中,過去一直依賴于Windows API函數(shù)的調(diào)用。而隨著新的編程語言和平臺的出現(xiàn),涌現(xiàn)了很多新的語言特性,這些語言特性可用于自動化測試工具的設(shè)計,例如反射機(jī)制就是其中一項技術(shù)。
提示
程序集包括模塊,模塊包含類型,類型包含成員。在.NET和Java中,都提供了反射的機(jī)制,反射提供了封裝程序集、模塊和類型的對象,可以通過反射動態(tài)地創(chuàng)建類型的實例,將類型綁定到現(xiàn)有對象,或者從現(xiàn)有對象中獲取類型,然后調(diào)用類型的方法或訪問其字段和屬性。
反射機(jī)制可被用在測試中,通過反射來加載被測試程序,獲取被測試程序的各種屬性,觸發(fā)被測試程序的各種事件,從而達(dá)到自動化測試的目的。例如,下面的C#代碼通過反射機(jī)制讀取程序中textBox1控件的Text屬性:
// 獲取控件屬性 static object GetControlPropertyValue(string controlName, string propertyName) { if (AUTForm.InvokeRequired) { Thread.Sleep(1000); return AUTForm.Invoke (new GetControlPropertyValueHandler(GetControlPropertyValue), new object[] { controlName, propertyName }); } // 獲取類型 Type t1 = AUTForm.GetType(); // 獲取類型中的成員 FieldInfo fi = t1.GetField(controlName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); object ctrl = fi.GetValue(AUTForm); Type t2 = ctrl.GetType(); // 獲取成員中的屬性 PropertyInfo pi = t2.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); // 返回控件屬性值 return pi.GetValue(ctrl, new object[0]); } delegate object GetControlPropertyValueHandler(string controlName, string propertyName);
而下面的C#代碼則通過反射機(jī)制調(diào)用控件的方法,模擬用戶點擊按鈕的過程:
// 模擬用戶點擊按鈕 InvokeMethod("button1_Click", new object[] { null, new EventArgs() }); // 調(diào)用控件方法 static void InvokeMethod(string methodName, params object[] parms) { if (AUTForm.InvokeRequired) { Thread.Sleep(1000); AUTForm.Invoke(new InvokeMethodHandler(InvokeMethod), new object[] { methodName, parms }); return; } // 獲取類型 Type t = AUTForm.GetType(); // 獲取類型中的指定方法 MethodInfo mi = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance; // 調(diào)用方法 mi.Invoke(AUTForm, parms); } delegate void InvokeMethodHandler(string methodName, params object[] arms);
3.3.5 UI Automation在自動化功能測試工具中的使用
隨著.NET 3.0和Vista的發(fā)布,微軟提供了一套嶄新的Windows界面框架,名為“UI Automation”,UI Automation在所有支持Windows Presentation Foundation (WPF)的操作系統(tǒng)中都可以使用。
UI Automation提供了一套對Windows界面的可編程的訪問機(jī)制,同時也為測試自動化工具提供了一個新的思路。例如,在使用QTP的.NET插件對WPF控件進(jìn)行測試時,就可以使用AutomationElement來訪問控件屬性,再例如,下面腳本通過AutomationElement訪問Test4窗體控件的Name屬性:
'通過AutomationElement訪問控件屬性 msgbox WpfWindow("Test4").AutomationElement.Current.Name
3.3.6 QTP對象識別技術(shù)
有了前面的基礎(chǔ),就不難理解QTP的工作原理了。QTP同樣是通過查找應(yīng)用程序界面中的各個控件的屬性來判斷是否與測試對象匹配,例如QTP中提供的“Object Spy”功能,就可以把某個界面控件的基本屬性列舉出來,如圖3.7所示。
另外,還可以根據(jù)控件的類型,把其擁有的可操作的方法列舉出來,如圖3.8所示。
針對不同平臺和語言編寫的控件,QTP會采用不同的對象識別方法,但是共通的一點是,通過查找對象屬性,依據(jù)該控件與其他控件能區(qū)分的屬性來判斷其身份,例如控件的類名、控件的文本等。QTP中的“Object Identification”界面中提供了一個可供測試員調(diào)整的對象識別配置器,如圖3.9所示。

圖3.7 QTP的“Object Spy”功能

圖3.8 使用“Object Spy”查看控件可操作的方法

圖3.9 QTP的“Object Identification”界面
提示
其中“Mandatory Properties”中的屬性是強(qiáng)制性的判斷準(zhǔn)則,“Assistive Properties”中的屬性用于輔助性地判斷。
單擊“Add/Remove”按鈕,可在如圖3.10所示的界面中添加更多的屬性用于唯一地標(biāo)識和區(qū)別某個控件實例。

圖3.10 添加屬性
- Learning Microsoft Azure Storage
- Dreamweaver CS3網(wǎng)頁設(shè)計50例
- MCSA Windows Server 2016 Certification Guide:Exam 70-741
- 21天學(xué)通C++
- 水晶石精粹:3ds max & ZBrush三維數(shù)字靜幀藝術(shù)
- 單片機(jī)原理實用教程
- Machine Learning Algorithms(Second Edition)
- Ansible 2 Cloud Automation Cookbook
- FANUC工業(yè)機(jī)器人配置與編程技術(shù)
- 與人共融機(jī)器人的關(guān)節(jié)力矩測量技術(shù)
- Cloudera Hadoop大數(shù)據(jù)平臺實戰(zhàn)指南
- 貫通Java Web輕量級應(yīng)用開發(fā)
- 數(shù)據(jù)清洗
- 精通ROS機(jī)器人編程(原書第2版)
- Flash CS5二維動畫設(shè)計與制作