Uvod u HtmlUnit

1. Uvod

U ovom ćemo članku predstaviti HtmlUnit, alat koji nam omogućuje, jednostavno rečeno, programski komunicirati i testirati HTML web stranicu, koristeći JAVA API-je.

2. O HtmlUnit-u

HtmlUnit je preglednik bez GUI-a - preglednik namijenjen programskoj, a ne izravnoj upotrebi korisnika.

Preglednik podržava JavaScript (putem Mozilla Rhino motora) i može se koristiti čak i za web stranice sa složenim AJAX funkcionalnostima. Sve se to može napraviti simulirajući tipični preglednik temeljen na GUI-u poput Chromea ili Firefoxa.

Naziv HtmlUnit mogao bi vas navesti na pomisao da je to okvir za testiranje, ali iako se definitivno može koristiti za testiranje, može i puno više od toga.

Također je integriran u Spring 4 i može se neometano koristiti zajedno s Spring MVC Test okvirom.

3. Preuzmi i Maven Ovisnost

HtmlUnit možete preuzeti s SourceForge ili sa službenog web mjesta. Također, možete ga uključiti u svoj alat za izgradnju (poput Mavena ili Gradlea, između ostalog) kao što možete vidjeti ovdje. Na primjer, ovo je ovisnost o Mavenu koju trenutno možete uključiti u svoj projekt:

 net.sourceforge.htmlunit htmlunit 2.23 

Najnoviju verziju možete pronaći ovdje.

4. Web testiranje

Postoji mnogo načina na koje možete testirati web aplikaciju - većinu smo u jednom ili drugom dijelu obradili ovdje na web mjestu.

Pomoću HtmlUnit možete izravno raščlaniti HTML web stranice, komunicirati s njom baš kao što bi to učinio uobičajeni korisnik iz preglednika, provjeriti sintaksu JavaScript i CSS, poslati obrasce i raščlaniti odgovore kako biste vidjeli sadržaj njegovih HTML elemenata. Sve to, koristeći čisti Java kod.

Počnimo s jednostavnim testom: stvorite a WebClient i dobiti prvu stranicu navigacije www.baeldung.com:

privatni WebClient webClient; @Prije javne void init () baca izuzetak {webClient = new WebClient (); } @Nakon javne void close () baca iznimku {webClient.close (); } @Test public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk () baca iznimku HtmlPage page = webClient.getPage ("/"); Assert.assertEquals ("Baeldung 

Možete vidjeti neka upozorenja ili pogreške prilikom pokretanja tog testa ako naša web stranica ima problema s JavaScriptom ili CSS-om. Trebali biste ih ispraviti.

Ponekad, ako znate što radite (na primjer, ako vidite da su jedine pogreške iz JavaScript biblioteka nezavisnih proizvođača koje ne biste trebali mijenjati), možete spriječiti da te pogreške naprave test neuspjelim, nazvavši setThrowExceptionOnScriptError s lažno:

@Test public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect () baca Exception tutorial Java, Spring i Web Development ", page.getTitleText ()); 

5. Web struganje

Ne trebate koristiti HtmlUnit samo za vlastite web stranice. Napokon je to preglednik: pomoću njega možete se kretati bilo kojim webom koji želite, slati i dohvatiti podatke po potrebi.

Dohvaćanje, raščlanjivanje, spremanje i analiza podataka s web stranica postupak je poznat kao struganje weba, a HtmlUnit vam može pomoći u dohvaćanju i raščlanjivanju dijelova.

Prethodni primjer pokazuje kako možemo ući u bilo koju web stranicu i kretati se kroz nju, dohvaćajući sve informacije koje želimo.

Na primjer, idemo u cijelu arhivu članaka Baeldunga, dođite do najnovijeg članka i dohvatimo njegov naslov (prvo

označiti). Za naš test to će biti dovoljno; ali, ako bismo željeli spremiti više informacija, mogli bismo, na primjer, dohvatiti naslove (sve

oznake), tako da imaju osnovnu ideju o čemu se radi u članku.

Lako je doći do elemenata prema njihovom ID-u, ali općenito, ako trebate pronaći element, to je prikladnije koristiti sintaksu XPath. HtmlUnit nam omogućuje da ga koristimo, pa ćemo i mi.

@Test javna praznina givenBaeldungArchive_whenRetrievingArticle_thenHasH1 () baca iznimku {webClient.getOptions (). SetCssEnabled (false); webClient.getOptions (). setJavaScriptEnabled (lažno); URL niza = "/ full_archive"; HtmlPage stranica = webClient.getPage (url); Niz xpath = "(// ul [@ class = 'car-monthlisting'] / li) [1] / a"; HtmlAnchor latestPostLink = (HtmlAnchor) page.getByXPath (xpath) .get (0); HtmlPage postPage = latestPostLink.click (); Popis h1 = (Popis) postPage.getByXPath ("// h1"); Assert.assertTrue (h1.size ()> 0); } 

Prvo napomenimo kako - u ovom nas slučaju CSS niti JavaScript ne zanimaju i želimo samo raščlaniti HTML izgled, pa smo isključili CSS i JavaScript.

U pravom struganju weba možete uzeti na primjer h1 i h2 naslova, a ishod bi bio otprilike ovakav:

Java Web Weekly, broj 135 1. Proljeće i Java 2. Tehnika i razmišljanja 3. Stripovi 4. Odabir tjedna

Možete provjeriti odgovaraju li preuzete informacije najnovijem članku u Baeldungu:

6. Što je s AJAX-om?

AJAX funkcionalnosti mogu predstavljati problem jer će HtmlUnit obično dohvatiti stranicu prije nego što završe AJAX pozivi. Često ih trebate završiti kako biste pravilno testirali svoje web mjesto ili dohvatili podatke koje želite. Postoji nekoliko načina kako se nositi s njima:

  • Možeš koristiti webClient.setAjaxController (novi NicelyResynchronizingAjaxController ()). To resinkronizira pozive izvršene iz glavne niti i ti se pozivi izvode sinkrono kako bi se osiguralo stabilno stanje za testiranje.
  • Prilikom ulaska na stranicu web-aplikacije možete pričekati nekoliko sekundi kako bi bilo dovoljno vremena da AJAX pozivi završe. Da biste to postigli, možete koristiti webClient.waitForBackgroundJavaScript (MILIS) ili webClient.waitForBackgroundJavaScriptStartingBefore (MILLIS). Trebali biste ih nazvati nakon dohvaćanja stranice, ali prije rada s njom.
  • Možete pričekati dok se ne ispune neki očekivani uvjet vezan za izvršavanje AJAX poziva. Na primjer:
za (int i = 0; i <20; i ++) {if (uvjet_za_srećanje_iz_izvršenja) {break; } sinkronizirano (stranica) {page.wait (500); }}
  • Umjesto stvaranja a novi WebClient (), koji je zadani za najbolje podržani web preglednik, isprobajte druge preglednike jer bi mogli bolje funkcionirati s vašim JavaScript ili AJAX pozivima. Na primjer, ovo će stvoriti webClient koji koristi preglednik Chrome:
WebClient webClient = novi WebClient (BrowserVersion.CHROME);

7. Primjer s proljećem

Ako testiramo vlastitu proljetnu aplikaciju, tada stvari postaju malo lakše - više nam nije potreban poslužitelj koji radi.

Primijenimo vrlo jednostavan primjer aplikacije: samo kontroler s metodom koja prima tekst i jednu HTML stranicu s obrascem. Korisnik može unijeti tekst u obrazac, poslati obrazac, a tekst će biti prikazan ispod tog obrasca.

U ovom ćemo slučaju za tu HTML stranicu upotrijebiti predložak Thymeleaf (ovdje možete vidjeti cjelovit primjer Thymeleaf):

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (classes = {TestConfig.class}) javna klasa HtmlUnitAndSpringTest {@Autowired private WebApplicationContext wac; privatni WebClient webClient; @ Prije postavljanja javne praznine () {webClient = MockMvcWebClientBuilder .webAppContextSetup (wac) .build (); } @Test public void givenAMessage_whenSent_thenItShows () baca iznimku {String text = "Hello world!"; Stranica HtmlPage; URL niza = "// localhost / message / showForm"; page = webClient.getPage (url); HtmlTextInput messageText = page.getHtmlElementById ("poruka"); messageText.setValueAttribute (tekst); HtmlForm obrazac = page.getForms (). Get (0); HtmlSubmitInput submit = form.getOneHtmlElementByAttribute ("input", "type", "submit"); HtmlPage newPage = submit.click (); Niz primljenTekst = newPage.getHtmlElementById ("primljen") .getTextContent (); Assert.assertEquals (primljeniTekst, tekst); }}

Ključ je ovdje izgradnja WebClient objekt pomoću MockMvcWebClientBuilder od WebApplicationContext. Uz WebClient, možemo dobiti prvu stranicu navigacije (primijetite kako se opslužuje lokalnihost) i počnite pregledavati odatle.

Kao što vidite, test parsira obrazac, unosi poruku (u polje s ID-om "poruka"), predaje obrazac i na novoj stranici tvrdi da je primljeni tekst (polje s ID-om "primljeno") isto kao i tekst koji smo predali.

8. Zaključak

HtmlUnit je izvrstan alat koji vam omogućuje jednostavno testiranje web aplikacija, popunjavanje polja obrazaca i njihovo slanje baš kao da web koristite u pregledniku.

Neprimjetno se integrira s Spring 4, a zajedno s Spring MVC Test framework daju vam vrlo moćno okruženje za izradu integracijskih testova svih vaših stranica čak i bez web servera.

Također, pomoću HtmlUnit-a možete automatizirati bilo koji zadatak povezan s pregledavanjem weba, poput dohvaćanja, raščlanjivanja, pohrane i analize podataka (struganje weba).

Kod možete dobiti na Githubu.