Protractor, Firefox ja InvalidElementStateError

No niin, aina oppii jotain uutta ja ihmeellistä. Protractor e2e testiautomaation pyörintä on vähän viime viikkoina yskinyt. Ensimmäinen ongelma oli automaatioserverin timeoutit, joiden syyksi paljastui jonkunmoinen bugi chrome selaimessa/sen driverissa.

Korjaukseksi otettiin käyttöön Firefox odotellessa Chromen palautumista toimintakuntoiseksi. Firefox ajoi iloisesti kaikki muut testit paitsi ne joissa valitaan selection listasta joku tietty arvo sisällön perusteella. Originaali koodi:

//Open selection box
selectBoxElement.click();
browser.waitForAngular();
selectBoxElement.element(by.cssContainingText('option', item)).click();
browser.waitForAngular();

SelectBoxElement on tässä se laatikko josta valinta tehdään, ja item on merkkijono jonka sisältö tulisi löytyä valittavasta arvosta. Toimii hienosti Chromessa! (Tai toimi… Grrr…)

No Firefox ei tästä tykkää. Avaa kyllä boxin ja valintakin siirtyy oikeaan kohtaan kyllä, mutta jotenkin silti boxin suljettua vanha arvo edelleen löytyy. Syyksi paljastui bugi Selenium webdriverissa, joka ai lauo change eventtiä oikein tässä tilanteessa Firefoxissa.

No eipä hätää, Interwebin voimalla löytyi korjaus tähän:

//Open selection box
 selectBoxElement.click();
 browser.waitForAngular();

// Make selection
selectBoxElement.element(by.cssContainingText('option', item)).click();
browser.waitForAngular();

// Firefox driver fix to trigger change event for Angular
browser.actions().mouseDown().mouseUp().perform();
browser.waitForAngular();

Joka toimikin viikon. Ja nyt:

InvalidElementStateError: [Exception… ”Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsINativeMouse.click]”

Jep jep, ja tähän ei löydy patchejä oikein mistään. Yhtäkkiä siis joko webdriver tai firefox saa halvauksen tuosta simuloidusta klikkauksesta, mahdollisesti koska se on väärässä kohtaa ruutua?

Tätä saikin sitten aikansa ihmetellä. Miten syvään suohon sitä voi fanaattisella testiautomaatiolla päätyä.. Kokeilin kaikenlaista, lähettää erinäisiä loitsuja sendKeys metodilla select laatikolle, arvolle, käyttää promiseja asynkroniseen etenemiseen siltä varalta että tämä on joku ajastusongelma. Ei apua, ei toimi.

Vaan toimiipa sittenkin. Sometimes less is more. Käy ilmi että valinnan voi tehdä myös epäintuitiivisesti avaamatta selectoboxia ennen. Käy ilmi että tämä toimii Chromessa ja Firefoxissa. Käy ilmi että nykyisellään tämä on ainoa tapa tehdä valinta selectboxista onnistuneesti.

Eli tuunauksen jälkeen, tässä oman autotallin algoritmi selectboxin valintaan protractorissa:

module.exports.selectDropdownByText = function selectOption(selectBoxElement, item) {
   selectBoxElement.element(by.cssContainingText('option', item)).click();
   browser.waitForAngular();
};

Ja taas toimii.

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