Descriptживо програмиране в QTP/UFTДинамичен и статичен
⚡ Умно обобщение
Descriptживото програмиране позволява на QTP or UFT Едно твърдение съдържа самото описание на обекта, като двойки стойности на свойства или като Descriptионния обект, така че стъпката се изпълнява дори когато обектът никога не е бил съхранен в хранилището на обекти.
Какво е DescriptПрограмирах ли?
Descriptive програмиране се използва за изпълнение на операции върху обект в AUT, чиято дефиниция не се съхранява в Хранилище на обектиИзползвайки този механизъм, можете да заобиколите идентификацията от хранилището на обекти и да предоставите обекта Descriptйон в самото изявление.
Името на обект се използва просто за съпоставяне на обект в скрипт с неговото описание в хранилище за обекти. Това означава, че ако промените името на обекта както в скрипта, така и в хранилището за обекти, скриптът все още трябва да се изпълнява. Гледайте следното видео по тази концепция.
Кликнете тук ако видеото не е достъпно
Видео Акценти
- Изтрийте обекта Descriptна полето WinEdit с име на агент от хранилището на обекти. Ако изпълните теста отново, той ще се провали, тъй като не може да разпознае обекта. Нека разгледаме причината, поради която скриптът се проваля.
- По време на изпълнение, UFT Единият идентифицира операцията, която се извършва върху полето WinEdit, и обекта DescriptИмето в хранилището на обекти се съхранява като име на агент. То използва това име, за да track обекта в хранилището на обекти. За родителски обект не можете да имате два дъщерни обекта с едно и също име, така че QTP уникално картографира обекта в хранилището. След това използва съхраненото описание в хранилището на обекти, замества името с описанието и използва получения оператор, за да идентифицира обекта в тестваното приложение.
- Тъй като в нашия случай бяхме изтрили изцяло това описание на обекта, скриптът се проваля.
- Но какво ще стане, ако вместо QTP замествайки описанието на обекта, вие като тестер директно посочвате описанията на обектите в скрипта си? Това не е нищо друго освен „Descriptive програмиране”
Тази единствена промяна на отговорността е това, което двете форми по-долу имплементират, като всяка форма е подходяща за различен вид скрипт.
Видове Descriptive програмиране
Можете да използвате DescriptПрограмирам по два начина
- Статичен
- Динамичен
Статичен Descriptive програмиране
В статичен метод, за идентификация на обект, вие указвате свойството на обект в следния формат
property:=values,
Този формат се нарича двойка стойност на свойство и е ограден в кавички. Написан изцяло, статичният оператор изглежда така:
TestObject("PropertyName1:=PropertyValue1", "PropertyName2:=PropertyValue2").Method
Ако вашият обект използва множество описания за идентификация, можете да ги посочите, като използвате запетаи.
Така че в нашия случай описанието за име на агент става
"nativeclass:=Edit", "attached text:=Agent Name:"
Статичните описания се четат в момента, в който се изпълнява операторът, което ги прави идеални за еднократни стъпки и за бързи корекции на скрипт, който не искате да презаписвате.
Динамичен Descriptive програмиране
Вторият метод за извършване на същото действие е използването на Dynamic Descriptive програмиране
В случай, че вашият скрипт използва кандидата за описателен програмен обект многократно, ще бъде много уморително да посочите всички двойки стойности на свойства за всеки израз
В такива случаи можете да използвате Descriptйонен клас, предоставен от QTP
Синтаксисът за създаване на обект за описание е
Set MyDescription = Description.Create() MyDescription("property").Value = "property-value"
Това е динамичният метод
Запълването на този обект със свойствата на името на агента, използвани по-горе, дава пълно, многократно използваемо описание:
Dim oDesc Set oDesc = Description.Create() oDesc("nativeclass").Value = "Edit" oDesc("attached text").Value = "Agent Name:"
Променливата Описание вече може да се предава на всеки оператор, който се нуждае от този обект, така че едно редактиране актуализира всяка стъпка, която го използва.
Статично срещу динамично DescriptЖиво програмиране: Кога да използвате всяко от тях
И двата формата създават едно и също описание по време на изпълнение, така че изборът е свързан с поддръжката, а не с възможностите.
| Критерии | Статично (вградено) | Динамичен (Descriptйонен обект) |
|---|---|---|
| Как е написано описанието | Двойки стойности на свойства, въведени в извикването на тестовия обект | Свойства, добавени към обект, създаден с Description.Create() |
| повторна употреба | Повтаря се във всяко изречение, което се нуждае от обекта | Съхранява се в една променлива и се предава където е необходимо |
| Четливост | Кратките изречения остават четливи; дългите стават тромави | Допълнителни редове за настройка, но самото изявление остава кратко |
| Промени по време на изпълнение | Стойностите са фиксирани, освен ако не са свързани от променливи | Стойностите на свойствата могат да бъдат преназначени преди всяка употреба |
| Работи с детски обекти | Не, аргументът на филтъра трябва да бъде Descriptйонен обект | Да, това е задължителната форма |
| Най-подходящ за | Една или две стъпки върху обект, който не е в хранилището | Обекти, използвани многократно, или колекции, извлечени по време на изпълнение |
Защо да използвате DescriptПрограмирах ли?
Преписът по-долу е придружен от видео обяснение на реален сценарий, при който броят на обектите не може да бъде известен предварително.
Препис на видеоклипове
- Въпросът за милион долара е защо да се използва DP, когато процесът на идентификация на обекти се обработва от QTP
- Да предположим, че ви е възложено да тествате портал за работа. Въвеждате заявка за търсене в портала и тестът ви очаква да изберете всички налични работни места и да щракнете върху „Приложи работа“.
- Но броят на отразените работни места ще зависи от заявката за търсене и наличните работни места по време на изпълнението на скрипта и няма начин да се предвиди предварително броят на отразените работни места.
- В такива случаи можете да използвате описателно програмиране. Дори и да не знаете броя и имената на квадратчетата за отметка, вие знаете класа за обектите, като „WebCheckBox"
- Можете да използвате Методът ChildObjects за връщане на обекти, принадлежащи на определен родител
- Ред код като –
Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()
ще върне всички дъщерни обекти за тази страница.
- Но ние искаме само WebCheckBox обекти. За да направим това, можем да създадем обект филтър и да зададем неговото свойство на класа на уеб квадратчето за отметка, след което да предадем този филтър като аргумент на метода ChildObjects
- В този случай се връщат само квадратчетата за отметка.
- След това можете да напишете код като този, който осъществява достъп до цялата колекция от квадратчета за отметка, започвайки от нула, и поставя всички квадратчета за отметка в положение ON.
- След това можете да щракнете върху бутона за прилагане, за да завършите теста
- Vous използване pouvez aussi DescriptИмам програмиране за стартиране на обекти, които са трудни за записване като автоматично скриване на панели, обекти с променящи се йерархии, вложени вътрешни обекти, подменюта.
- Можете също така да правите разширени манипулации на низове, като използвате описателно програмиране
- Във връзка със свойството index, описателното програмиране може да бъде много полезно при идентифицирането на трудни обекти.
- Ако използвате програмно описание за обект в йерархия на обекти, ще трябва да използвате описателно програмиране за следващите дъщерни обекти.
- Например, ако за обекта Page е използвано описателно програмиране, но следващият дъщерен обект WinEdit е дошъл от хранилището на обекти, твърдението е неправилно.
- Напротив, когато описателното програмиране се използва както за обектите Page, така и за обектите WinEdit, твърдението е правилно.
В запис, филтърът и цикълът, описани в преписа, изглеждат така:
Dim oFilter, allCheckBoxes, i Set oFilter = Description.Create() oFilter("micclass").Value = "WebCheckBox" Set allCheckBoxes = Browser("Jobs").Page("QTP").ChildObjects(oFilter) For i = 0 To allCheckBoxes.Count - 1 allCheckBoxes(i).Set "ON" Next
Колекцията е базирана на нула, поради което цикълът спира на Брой – 1Тъй като филтърът се оценява при изпълнение на реда, един и същ код работи независимо дали търсенето връща три или тридесет задания.
Регулярни изрази, ординални идентификатори и често срещани капани
DescriptЖивото програмиране се държи по два начина, които изненадват повечето хора първия път, когато даден оператор се провали без видима причина.
1) Всяка стойност на свойство се третира като регулярен израз. Надпис като например Общо (щ.д.) следователно не съвпада, защото скобите са синтаксис на регулярни изрази. За да ги избегнете, използвайте обратна наклонена черта или изключете оценката на регулярни изрази за това свойство на Descriptйонен обект:
Set oDesc = Description.Create() oDesc("name").Value = "Total (USD)" oDesc("name").RegularExpression = False
2) Порядковите идентификатори прекъсват връзките. Когато дадено описание все още съвпада с повече от един обект, добавете индекс, място or време за създаване като допълнително свойство. Броят на индексите започва от нула:
WebEdit("name:=userName", "html tag:=INPUT", "index:=0").Set "guru99" WebEdit("name:=userName", "html tag:=INPUT", "index:=1").Set "guru99"
Струва си да проверите още три капана, преди да започнете да отстранявате грешки в приложението:
- употреба микроклас, а не етикетът Име на класа показано в Object Spy. Показваното име не е валидно свойство в описанието.
- Имената на свойствата не са чувствителни към главни и малки букви, но трябва да се изписват точно както технологията ги съобщава, включително интервала в приложен текст намлява HTML етикет.
- DescriptАктивното програмиране заобикаля хранилището; то не подобрява разпознаването на обекти. Ако не е заредена правилната добавка, никакво описание няма да направи обекта разпознаваем.
