Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Servodriver-testiharness

Servodriver on wptrunner-kehyksen ja WebDriver-palvelimen päälle rakennettu testiharness. Se ei ole vielä oletuksena käytössä, mutta sen voi ajaa lisäämällä --product servodriver -argumentin mihin tahansa test-wpt-komentoon. Servodriver koostuu kolmesta pääkomponentista: Python-testiharness, joka orkestroi selainta, Servon sisäinen web-palvelin, joka toteuttaa WebDriver-spesifikaation, ja testisivujen sisällä ladattavat skriptit.

wptrunner-harness

Wptrunner on harness, joka käyttää executor- ja browser-yhdistelmää tuen tuotteen käynnistämiseen. browser määrittelee Python-luokat instanssien luomiseen ja metodit tuettujen konfiguraatioiden kutsumiseen sekä argumentit Servo-binääriä käynnistettäessä. Se delegoi kaiken WebDriver-spesifisen logiikan perus WebDriverBrowser-luokalle, joka on yhteinen kaikille WebDriveriin luottaville selaimille.

Servodriverin executor määrittelee Servo-spesifisen testien alustuksen, tulosten käsittelyn ja testien välisen tilan hallinnan. Esimerkiksi Servo määrittelee WebDriver-laajennusmetodit preferenssien hallintaan, ja näitä kutsutaan testien välillä varmistaakseen, että jokainen testi ajaa tarkoitetulla konfiguraatiollamme.

Servodriver-executormme delegoi paljon logiikkaa yhteiselle WebDriverTestharnessExecutor -luokalle. Tämä executor on vastuussa testdriver.js-harnessin suorittamisesta ja mahdollistaa Python-harnessin hakevan testitulokset selaimesta.

Servon WebDriver-toteutus

Tässä toteutuksessa on kolme pääkomponenttia: server handler, script handler ja input handler.

Server handler

Kun wptrunner yhdistää WebDriver-palvelimeen uudessa Servo-instanssissa, se luo uuden session -instanssin. Tämä sessio säilyttää tilaa WebDriver API -kutsujen välillä. Selaimen kanssa vuorovaikuttavat API-kutsut reititetään constellationin kautta ConstellationMsg::WebDriverCommand -viesteinä, ja ne, joiden täytyy vuorovaikuttaa suoraan dokumentin sisällön kanssa, kuuluvat WebDriverScriptCommand -enum:iin. Monet näistä API:sta vaativat synkronisen vastauksen IpcSender-kanavan kautta, jota Servon WebDriver-palvelin käyttää odottaakseen vastausta. Tapaukset kuten navigointi ja asynkronisten skriptien suoritus sisältävät kuitenkin lisäsynkronointia.

Kun navigointia pyydetään, constellation vastaanottaa IpcSenderin, jonka se tallentaa. Kun navigointi valmistuu, constellation tarkistaa, vastaako pipeline WebDriverin navigointia, ja ilmoittaa WebDriver-palvelimelle alkuperäistä kanavaa käyttäen.

Asynkroniset skriptit

Kun asynkronisen skriptin suoritus aloitetaan, WebDriver-spesifikaatio tarjoaa tavan skriptien kommunikoida tulosta palvelimelle. Skripti kutsutaan anonyyminä funktiona lisäfunktioargumentilla, joka lähettää vastauksen palvelimelle.

Script handler

Kun WebDriver-viesti, joka kohdistuu tiettyyn selauskontekstiin, vastaanotetaan, ScriptThread, joka sisältää aktiivisen dokumentin, käsittelee sen. Kunkin komennon käsittelylogiikka sijaitsee webdriver_handlers.rs -tiedostossa. Mikä tahansa komento, joka palauttaa web-sisällöstä johdetun arvon, täytyy serialisoida JS-arvot arvoiksi, jotka WebDriver-palvelin voi muuntaa API-arvotyypeiksi.

Altistamme kaksi webistä saavutettavaa metodia asynkronisten tulosten kommunikointiin WebDriver-palvelimelle: Window.webdriverCallback ja Window.webdriverTimeout.

Input handler

Kun WebDriver-palvelin vastaanottaa syöte-toimintokomentoja (esim. osoitin- tai hiiritoiminnot), se luo toimintosekvenssin ja dispatch:aa ne asteittain compositorille constellationin kautta. Compositor käsittelee nämä tapahtumat samalla tavalla kuin upottajalta vastaanotetut syöte-tapahtumat (poislukien tunnetut bugit).

Testisivujen skriptit

testdriver-harness yhdistää kaikki nämä elementit yhteen. Executor avaa uuden ikkunan ja kutsuu asynkronista skriptiä, joka asettaa testdriver-callbackin arvoon Window.webdriverCallback (arguments[arguments.length - 1]). Tämä ikkuna luo viestijonon, jota executor-harness lukee. Myöhemmin jokainen ajettava testi avataan uutena ikkunana; nämä ikkunat voivat käyttää opener.postMessage kommunikoidakseen alkuperäisen ikkunan kanssa, mikä mahdollistaa testdriver API:en lähettää viestejä, jotka edustavat WebDriver API -kutsuja.

Debuggausvinkit

Aloita aina seuraavalla RUST_LOG:lla:

RUST_LOG=webdriver_server,webdriver,script::webdriver_handlers,constellation

Tämä yleensä tekee selväksi, käsitelläänkö odotetut API-kutsut.

Kun debuggaat syöte-ongelmia, lisää JS-debug-rivit, jotka loggaavat klikattavan elementin getBoundingClientRect()-arvon, ja vertaa compositorin vastaanottamia koordinaatteja manuaalisessa klikkauksessa vs. WebDriver-palvelimen lähettämiä koordinaatteja.