Descriptive-ohjelmointi QTP/UFTDynaaminen ja staattinen

⚡ Älykäs yhteenveto

Descriptive-ohjelmointi antaa a:lle mahdollisuuden QTP or UFT Yksi lauseke sisältää itse objektin kuvauksen, ominaisuus-arvopareina tai Description-objekti, joten vaihe suoritetaan, vaikka objektia ei olisi koskaan tallennettu objektisäilöön.

  • 🔘 Ohittaa arkiston: Kuvaus kulkee lausekkeen sisällä, joten objektin nimeä ei tarvitse etsiä suorituksen aikana.
  • ☑️ Staattinen muoto: Ominaisuus-arvoparit kirjoitetaan riville muodossa ”property:=value” pilkuilla erotettuna testiobjektikutsussa.
  • ✅ Dynaaminen muoto: Description.Create luo uudelleenkäytettävän ominaisuuskokoelman, jota useat lausekkeet voivat jakaa.
  • 🧪 Rakennettu ennalta arvaamattomille kohteille: Paneelien automaattinen piilotus, hierarkioiden muuttaminen, sisäkkäiset objektit ja tuntemattoman kokoiset tulosjoukot.
  • 🛠️ ChildObjects muodostaa parin sen kanssa: A DescriptSuodattimena käytetty ion-objekti palauttaa vain vanhemman vastaavat lapset.
  • 📌 Kaksi muistettavaa sääntöä: Jokaista ominaisuuden arvoa käsitellään säännöllisenä lausekkeena, ja kun kuvaat vanhemman, sinun on kuvattava myös sen lapset.

Staattiset ja dynaamiset kuvailevat ohjelmointilauseet QTP ja UFT yksi

Mikä on Descriptive ohjelmointi?

Descriptive ohjelmointi käytetään suorittamaan toimintoja AUT:n objektille, jonka määritelmää ei ole tallennettu ObjektivarastoTämän mekanismin avulla voit ohittaa tunnistuksen Object Repositorysta ja toimittaa Object-tiedoston. Descriptioni itse lausunnossa.

Objektin nimeä käytetään yksinkertaisesti yhdistämään skriptissä oleva objekti sen kuvaukseen objektitietokannassa. Tämä tarkoittaa, että jos muutat objektin nimeä sekä skriptissäsi että objektitietokannassa, skriptin pitäisi silti toimia. Katso seuraava video tästä konseptista.

Napauta täältä jos video ei ole saatavilla

Video Highlights

  • Poista objekti DescriptObjektitietovaraston Agentin nimi WinEdit-ruudusta. Jos suoritat testin uudelleen, se epäonnistuu, koska se ei tunnista objektia. Tarkastellaanpa syytä, miksi komentosarja epäonnistuu.
  • Suoritusajan aikana UFT Yksi tunnistaa WinEdit-ruudussa suoritettavan toiminnon ja objektin DescriptObjektitietovarastossa oleva ion tallennetaan agentin nimenä. Se käyttää tätä nimeä track objekti objektivarastossa. Yläobjektilla ei voi olla kahta samannimistä aliobjektia, joten QTP kartoittaa objektin yksilöllisesti tietovarastossa. Sitten se käyttää tallennettua kuvausta Object Repositoryssa, korvaa nimen kuvauksella ja käyttää tuloksena olevaa lauseketta objektin tunnistamiseen testattavassa sovelluksessa.
  • Koska meidän tapauksessamme olimme poistaneet tämän objektikuvauksen kokonaan, skripti epäonnistuu
  • Mutta entä jos sen sijaan, että QTP korvaatko objektikuvauksen, määritätkö testaajana suoraan objektikuvaukset skriptissäsi? Tämä ei ole muuta kuin "Descriptive ohjelmointi"

Tuo yksi vastuunmuutos toteutetaan kahdella alla olevalla lomakkeella, ja kukin lomake sopii erityyppiseen skriptiin.

Tyyppisiä Descriptive ohjelmointi

Voit käyttää Descriptohjelmointi kahdella tavalla

  1. Staattinen
  2. Dynaaminen

Staattinen Descriptive ohjelmointi

Staattisessa menetelmässä objektin tunnistamista varten määrität objektin ominaisuuden seuraavassa muodossa

property:=values,

Tätä muotoa kutsutaan ominaisuus-arvopariksi, ja se kirjoitetaan lainausmerkkeihin. Täydellisesti kirjoitettuna staattinen lauseke näyttää tältä:

TestObject("PropertyName1:=PropertyValue1", "PropertyName2:=PropertyValue2").Method

Jos objektisi käyttää useita kuvauksia tunnistamiseen, voit määrittää ne pilkuilla

Joten meidän tapauksessamme Agentin nimen kuvaus tulee

"nativeclass:=Edit", "attached text:=Agent Name:"

Staattiset kuvaukset luetaan lausekkeen suorituskohdassa, minkä vuoksi ne sopivat erinomaisesti kertaluonteisiin vaiheisiin ja skriptien nopeisiin korjauksiin, joita ei haluta tallentaa uudelleen.

Dynaaminen Descriptive ohjelmointi

Toinen tapa tehdä sama toiminto on käyttää Dynamic Descriptive ohjelmointi

Jos komentosarjasi käyttää kuvaavaa ohjelmointiobjektiehdokasta useita kertoja, on erittäin väsyttävää määrittää kaikki ominaisuusarvoparit jokaiselle lauseelle

Tällaisissa tapauksissa voit käyttää Descriptioniluokka, jonka tarjoaa QTP

Kuvausobjektin luomisen syntaksi on

Set MyDescription = Description.Create()
MyDescription("property").Value = "property-value"

Tämä on dynaaminen menetelmä

Täyttämällä objektin yllä käytetyillä Agent Name -ominaisuuksilla saadaan täydellinen, uudelleenkäytettävä kuvaus:

Dim oDesc
Set oDesc = Description.Create()
oDesc("nativeclass").Value = "Edit"
oDesc("attached text").Value = "Agent Name:"

Muuttuja oKuvaus voidaan nyt välittää mihin tahansa lauseeseen, joka tarvitsee kyseistä objektia, joten yksi muokkaus päivittää jokaisen vaiheen, joka sitä käyttää.

Staattinen vs. dynaaminen Descriptive-ohjelmointi: Milloin kutakin käytetään

Molemmat lomakkeet tuottavat saman ajonaikaisen kuvauksen, joten valinta koskee pikemminkin ylläpitoa kuin kykyä.

Kriteeri Staattinen (rivissä) Dynaaminen (Descriptioni-objekti)
Näin kuvaus on kirjoitettu Testikohteen kutsun sisällä kirjoitetut ominaisuusarvoparit Ominaisuudet, jotka on lisätty luotuun objektiin Description.Create()
Käyttää uudelleen Toistuu jokaisessa lausekkeessa, joka tarvitsee objektin Tallennetaan yhteen muuttujaan ja välitetään tarvittaessa
luettavuus Lyhyet lauseet pysyvät luettavina; pitkät vaikeuttavat lukemista Ylimääräisiä aloitusrivejä, mutta itse lauseke pysyy lyhyenä
Suoritusaikaiset muutokset Arvot ovat kiinteitä, elleivät ne ole yhdistetty muuttujista Ominaisuusarvot voidaan määrittää uudelleen ennen jokaista käyttökertaa
Toimii ChildObjects-objektien kanssa Ei, suodatinargumentin on oltava Descriptioniobjekti Kyllä, tämä on pakollinen lomake
Soveltuu parhaiten Yksi tai kaksi vaihetta objektissa, jota ei ole repositoriossa Toistuvasti käytetyt objektit tai suorituksen aikana haetut kokoelmat

Miksi käyttää Descriptive ohjelmointi?

Alla oleva transkriptio liittyy videon läpikäyntiin todellisesta tilanteesta, jossa esineiden lukumäärää ei voida tietää etukäteen.

Video-transkripti

  • Miljoonan dollarin kysymys on, miksi käyttää DP:tä, kun objektin tunnistusprosessia hoitaa QTP
  • Oletetaan, että sinulle on annettu tehtäväksi testata työpaikkaportaalia. Syötät hakukyselyn portaaliin, ja testi odottaa sinun valitsevan kaikki saatavilla olevat työpaikat ja napsauttavan Hae työpaikkaa.
  • Mutta heijastettavien töiden määrä riippuu hakukyselystä ja komentosarjan suoritushetkellä saatavilla olevista töistä, eikä heijastettavien töiden määrää voida ennustaa etukäteen.
  • Tällaisissa tapauksissa voit käyttää kuvailevaa ohjelmointia. Vaikka et tiedä valintaruutujen lukumäärää ja nimiä, tiedät objektien luokan nimellä ”WebCheck”.Box"
  • Voit käyttää ChildObjects-metodi palauttaa tietylle vanhemmalle kuuluvia objekteja
  • Koodirivi, kuten -
    Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()

    palauttaa kaikki tämän sivun aliobjektit.

  • Mutta haluamme vain WebCheckinBox objektit. Tätä varten voimme luoda suodatinobjektin ja asettaa sen ominaisuuden web-valintaruutuluokkaan ja sitten välittää tämän suodattimen argumenttina ChildObjects-metodille.
  • Tässä tapauksessa vain valintaruudut palautetaan.
  • Seuraavaksi voit kirjoittaa tällaisen koodin, joka käyttää koko valintaruutujen kokoelmaa nollasta alkaen ja asettaa kaikki valintaruudut päälle.
  • Seuraavaksi voit suorittaa testin napsauttamalla Käytä-painiketta
  • Voit myös käyttää Descriptive Ohjelmointi suorittamaan kohteita, joita on vaikea tallentaa, kuten automaattinen piilotuspaneelit, objektit muuttuvilla hierarkioilla, sisäkkäiset sisäiset objektit, alivalikot.
  • Voit myös tehdä edistyneitä merkkijonokäsittelyjä käyttämällä kuvaavaa ohjelmointia
  • Yhdessä index-ominaisuuden kanssa kuvaileva ohjelmointi voi olla erittäin hyödyllistä vaikeiden objektien tunnistamisessa.
  • Jos käytät ohjelmallista kuvausta objektihierarkiassa olevalle objektille, sinun on käytettävä kuvailevaa ohjelmointia sitä seuraaville aliobjekteille.
  • Jos esimerkiksi Page-objektille on käytetty kuvailevaa ohjelmointia, mutta sitä seuraava WinEdit-aliobjekti on peräisin Object Repositorysta, lauseke on virheellinen.
  • Päinvastoin, kun kuvailevaa ohjelmointia käytetään sekä Page- että WinEdit-objekteille, lause on oikein.

Kirjoitettuna transkriptiossa kuvattu suodatin ja silmukka näyttävät tältä:

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

Kokoelma perustuu nollaan, minkä vuoksi silmukka pysähtyy kohtaan Määrä – 1Koska suodatinta arvioidaan rivin suorituksen yhteydessä, sama koodi toimii riippumatta siitä, palauttaako haku kolme vai kolmekymmentä työtä.

Säännölliset lausekkeet, järjestyslukutunnisteet ja yleiset sudenkuopat

DescriptIve-ohjelmointi käyttäytyy kahdella tavalla, jotka yllättävät useimmat ihmiset ensimmäisellä kerralla, kun lauseke epäonnistuu ilman näkyvää syytä.

1) Jokaista ominaisuuden arvoa käsitellään säännöllisenä lausekkeena. Kuvateksti, kuten Yhteensä (USD) ei siis löydä vastinetta, koska sulkeet ovat säännöllisten lausekkeiden syntaksia. Poista ne kenoviivalla tai poista säännöllisten lausekkeiden arviointi käytöstä kyseiselle ominaisuudelle Descriptioni-objekti:

Set oDesc = Description.Create()
oDesc("name").Value = "Total (USD)"
oDesc("name").RegularExpression = False

2) Järjestysluvut ratkaisevat tasatilanteet. Kun kuvaus vastaa edelleen useampaa kuin yhtä kohdetta, lisää indeksi, sijainti or luomisaika ylimääräisenä ominaisuutena. Indeksilaskenta alkaa nollasta:

WebEdit("name:=userName", "html tag:=INPUT", "index:=0").Set "guru99"
WebEdit("name:=userName", "html tag:=INPUT", "index:=1").Set "guru99"

Kolme muuta sudenkuoppaa kannattaa tarkistaa ennen sovelluksen virheenkorjauksen aloittamista:

  • Käyttää mikroluokka, ei etikettiä Luokan nimi näkyy Object Spyssa. Näyttönimi ei ole kelvollinen ominaisuus kuvauksessa.
  • Ominaisuuksien nimissä ei ole kirjainkokoeroa, mutta ne on kirjoitettava täsmälleen samalla tavalla kuin teknologia ne raportoi, mukaan lukien välilyönti liitteenä oleva teksti ja html-tagi.
  • DescriptIve-ohjelmointi ohittaa repositorion; se ei paranna objektin tunnistusta. Jos oikeaa lisäosaa ei ole ladattu, mikään kuvaus ei tee objektista tunnistettavaa.

UKK

Kohta Object Spy ohjauksessa ja lue sen tunnisteominaisuudet tai kutsu GetROProperty-funktiota suorituksen aikana. Kopioi nimet täsmälleen luettelon mukaisesti muistaen, että Object Spy näyttää micclassin luokan nimen alla.

Ei yleensä. Tietovarastohaku ratkaisee tallennetun kuvauksen kerran, kun taas deskriptoitu lauseke lasketaan joka kerta, kun rivi suoritetaan. Kuvailevan ohjelmoinnin etuna on joustavuus ennakoimattomien objektien kanssa, ei raaka nopeus.

Rakenna Description-objekti uudelleenkäytettävän funktion sisällä ja pidä kyseinen funktio vbscript testiin liittyvä funktiokirjasto. Jokainen kirjastoa lataava toiminto voi sitten kutsua sitä, joten yksi muokkaus päivittää kaikki kutsujat.

Tekoälyavusteinen tunnistus yhdistää ohjausobjektit visuaalisen ulkonäön ja lähellä olevan otsikkotekstin perusteella kiinteiden ominaisuuksien sijaan, mikä poistaa joitakin käsinkirjoitettuja kuvauksia. DescriptIoneja tarvitaan edelleen silloin, kun objekteja lasketaan tai suodatetaan suorituksen aikana.

Copilot voi rakentaa silmukoita, Description.Luo kutsuja ja raportointia kuvauksen ympärille, mutta se ei voi nähdä sovellustasi. Jokainen sen ehdottama ominaisuuden nimi ja arvo on vahvistettava todellista ohjausobjektia vasten ennen kuin lausekkeeseen luotetaan.

Harvoin. A jaettu objektivarasto pitää kuvaukset yhdessä muokattavassa paikassa ja skriptit luettavissa. Useimmat tiimit pitävät vakaita näyttöjä arkistossa ja käsittelevät kuvauksia vain, jos objektit ovat dynaamisia.

Supista se yhteen ominaisuuteen ja lisää sitten muut takaisin yksi kerrallaan. Objektien määrän tarkistaminen ChildObjects-suodattimella näyttää, vastaako kuvaus mitään vai vastaako se useita objekteja epäselvästi.

Kyllä. Se toimii kaikilla teknologioilla, joiden lisäosa on ladattu, mukaan lukien vakioteknologiat. Windows, verkko, .NET, Java ja pääteemulaattoriobjektit. Vain ominaisuuksien nimet eroavat toisistaan, koska jokainen lisäosa raportoi omat tunnisteominaisuutensa.

Tiivistä tämä viesti seuraavasti: