AngularJS, Protractor, ja hidas testiympäristö

Tulipa ajankohtaiseksi miettiä miten protractorin voisi saada odottelemaan että jotain on saatavana ruudulla, ennen kuin yrittää alkaa sitä klikkailemaan.

Periaattessahan protractorin pitäisi olla Angular-elinkaaresta hyvinkin tietoinen, ja odotella asynkronisten kutsujen valmistumista ennen kuin etenee. Hätätapauksessa on taikauskonomainen browser.waitForAngular() jonka pitäisi tehdä samantapaista.

Nyt näyttäisi kuitenkin siltä, että protractor (traktorin puolesta? 🙂 ei näin aina tee, etenkin jos testikone on hidas/jähmeä *köhköhvirtuaalikoneköhköh*. Voi siis käydä niin että yhdessä koneessa testit sujahtavat iloisen vihreänä läpi ja toisessa helottavat punaisina satunnaisesti. Tämä ei ole oikein hyvä juttu testiympäristön kannalta.

Protractorissa on melkoisen epämiellyttävää kirjailla koodia joka tutkii onko elementit näkösällä – nuo element(by.xxx()) komennot kun palauttavat lupausta tulevasta, promiseja, jotka pitää ratkoa asynkronisesti. Kun haluaa tarkistaa useamman elementin näkyvyyden/enabloinnin, tulee ihastuttavia sisäkkäisiä lohkoja joita itse en tykkää koodissa katsella.

Vaan eipä hätää. Löysin taannoin juuri tähän sopivan syntaksin, joka toimii porttina estäen testin etenemisen kunnes kohde löytyy tai timeout pamahtaa. Se on näinkin simppeli:

browser.wait(element(by.id('my-id')).isPresent);

browser.wait(element(by.id('my-id')).isDisplayed);

browser.wait(element(by.id('my-id')).isEnabled);

Tämäkin on jonnekin manuaalin uumeniin haudottu. Näillä voi hidastaa tahtia sen verran että hitaammatkin myllyt ehtivät painelemaan nappeja kun käyttöliittymä morffaa silmien edessä. Tuolle browser.wait funktiolle muuten kelpaa miten hyvänsä muotoiltu promise jota voi tutkiskella.

Tietysti menisi liian helpoksi jo se olisi ihan noin toiminut. Tuo isPresent ainakin itsellä antoi jotain herkullista cannot get count for undefined erroriherjaa joten tein sille hiukan kankeamman vastineen:

browser.wait(function () {
 return browser.isElementPresent(element(by.id('zzzzz')));
 }, 10000);

Nämä voi hautoa mukaviin uudelleenkäytettäviin funktioihin, ja taas testiautomaatio jauhaa luotettavammin!

 

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s