Úvod do HtmlUnit

1. Úvod

V tomto článku si predstavíme HtmlUnit, nástroj, ktorý nám umožňuje, zjednodušene povedané, interagujte s webovou stránkou HTML a programujte ju programovo pomocou rozhraní API JAVA.

2. O aplikácii HtmlUnit

HtmlUnit je prehliadač bez grafického používateľského rozhrania - prehľadávač určený na programové použitie, a nie priamo používateľom.

Prehliadač podporuje JavaScript (cez engine Mozilla Rhino) a dá sa použiť aj pre webové stránky so zložitými funkciami AJAX. To všetko je možné vykonať simuláciou typického prehliadača založeného na grafickom používateľskom rozhraní, ako je Chrome alebo Firefox.

Názov HtmlUnit vás môže priviesť k názoru, že ide o testovací rámec, ale aj keď sa dá na testovanie určite použiť, dokáže toho oveľa viac.

Bola tiež integrovaná do jari 4 a dá sa bez problémov použiť spolu s jarným testovacím rámcom MVC.

3. Stiahnutie a závislosť Maven

HtmlUnit je možné stiahnuť zo stránky SourceForge alebo z oficiálnych webových stránok. Môžete ich tiež zahrnúť do svojho stavebného nástroja (napríklad Maven alebo Gradle), ako vidíte tu. Napríklad toto je závislosť Maven, ktorú momentálne môžete zahrnúť do svojho projektu:

 net.sourceforge.htmljednotka htmljednotka 2.23 

Najnovšiu verziu nájdete tu.

4. Testovanie webu

Existuje mnoho spôsobov, ako môžete otestovať webovú aplikáciu - väčšinu z nich sme tu, v tej či onej chvíli, zahrnuli sem.

Pomocou HtmlUnit môžete priamo analyzovať HTML stránok, interagovať s nimi rovnako ako s bežnými používateľmi z prehliadača, skontrolovať syntax jazyka JavaScript a CSS, odosielať formuláre a analyzovať odpovede, aby ste videli obsah ich prvkov HTML. To všetko pomocou čistého kódu Java.

Začnime jednoduchým testom: vytvorte a Webový klient a získate prvú stránku navigácie v www.baeldung.com:

súkromný WebClient webClient; @ Pred public void init () vyvolá výnimku {webClient = nový WebClient (); } @ Po public void close () hodí výnimku {webClient.close (); } @Test public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk () vyvolá výnimku HtmlPage page = webClient.getPage ("/"); Assert.assertEquals ("Baeldung 

Ak má náš web problémy s jazykom JavaScript alebo CSS, pri spustení tohto testu sa môžu zobraziť niektoré varovania alebo chyby. Mali by ste ich opraviť.

Niekedy, ak viete, čo robíte (napríklad ak zistíte, že jediné chyby, ktoré máte, sú z knižníc JavaScriptu tretích strán, ktoré by ste nemali upravovať), môžete zabrániť zlyhaniu týchto chýb tak, že zavoláte na číslo setThrowExceptionOnScriptError s nepravdivé:

@Test public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect () vyvolá výukové programy pre Java, Spring a Web Development ", page.getTitleText ()); 

5. Škrabanie webu

HtmlUnit nemusíte používať iba pre svoje vlastné webové stránky. Je to koniec koncov prehliadač: môžete ho použiť na navigáciu na ľubovoľnom webe, ktorý sa vám páči, na odosielanie a načítanie údajov podľa potreby.

Načítanie, analýza, ukladanie a analýza údajov z webových stránok je proces známy ako škrabanie webu a HtmlUnit vám môže pomôcť s načítaním a analýzou častí.

Predchádzajúci príklad ukazuje, ako môžeme vstúpiť na ľubovoľnú webovú stránku, prechádzať sa po nej a načítať všetky požadované informácie.

Napríklad poďme do úplného archívu článkov spoločnosti Baeldung, prejdite na najnovší článok a získajte jeho názov (prvý

značka). Pre náš test to bude stačiť; ale ak by sme chceli uložiť viac informácií, mohli by sme napríklad načítať nadpisy (všetky

značky), čím získate základnú predstavu o tom, o čom je článok.

Je ľahké získať prvky podľa ich ID, ale všeobecne, ak potrebujete nájsť prvok, je to pohodlnejšie sk Použi syntax XPath. HtmlUnit nám umožňuje používať ho, takže aj budeme.

@ Test public void givenBaeldungArchive_whenRetrievingArticle_thenHasH1 () vyvolá výnimku {webClient.getOptions (). SetCssEnabled (false); webClient.getOptions (). setJavaScriptEnabled (false); Reťazec url = "/ full_archive"; HtmlPage page = webClient.getPage (url); Reťazec xpath = "(// ul [@ class = 'car-monthlisting'] / li) [1] / a"; HtmlAnchor latestPostLink = (HtmlAnchor) page.getByXPath (xpath) .get (0); HtmlPage postPage = latestPostLink.click (); Zoznam h1 = (Zoznam) postPage.getByXPath ("// h1"); Assert.assertTrue (h1.size ()> 0); } 

Najprv si všimnite, ako - v tomto prípade nás nezaujímajú CSS ani JavaScript a chceme iba analyzovať rozloženie HTML, takže sme CSS a JavaScript vypli.

Pri skutočnom scrapingu webu by ste mohli vziať napríklad h1 a h2 titulov a výsledkom by bolo asi toto:

Java Web Weekly, vydanie 135 1. jar a Java 2. technické a myslenie 3. komiksy 4. výber týždňa

Môžete skontrolovať, či načítané informácie skutočne zodpovedajú poslednému článku v Baeldungu:

6. Čo AJAX?

Problémom môžu byť funkcie AJAX, pretože HtmlUnit stránku zvyčajne obnoví pred dokončením hovorov AJAX. Mnohokrát ich potrebujete na dokončenie, aby ste mohli správne otestovať svoje webové stránky alebo načítať požadované údaje. Existuje niekoľko spôsobov, ako s nimi zaobchádzať:

  • Môžeš použiť webClient.setAjaxController (nový NicelyResynchronizingAjaxController ()). Toto resynchronizuje volania uskutočňované z hlavného vlákna a tieto volania sa vykonávajú synchrónne, aby sa zabezpečil stabilný stav na testovanie.
  • Pri vstupe na stránku webovej aplikácie môžete počkať niekoľko sekúnd, aby ste mali dostatok času na dokončenie hovorov AJAX. Aby ste to dosiahli, môžete použiť webClient.waitForBackgroundJavaScript (MILLIS) alebo webClient.waitForBackgroundJavaScriptStartingBefore (MILLIS). Mali by ste im zavolať po načítaní stránky, ale skôr, ako s ňou začnete pracovať.
  • Môžete počkať, kým nebude splnená očakávaná podmienka súvisiaca s vykonaním hovoru AJAX. Napríklad:
for (int i = 0; i <20; i ++) {if (condition_to_happen_after_js_execution) {break; } synchronizované (stránka) {page.wait (500); }}
  • Namiesto vytvorenia a nový Webový klient (), ktorý je predvoleným nastavením najlepšie podporovaného webového prehľadávača, vyskúšajte iné prehľadávače, pretože by mohli lepšie pracovať s vašimi hovormi v jazyku JavaScript alebo AJAX. Napríklad sa vytvorí webový klient, ktorý používa prehliadač Chrome:
WebClient webClient = nový WebClient (BrowserVersion.CHROME);

7. Príklad s jarou

Ak testujeme našu vlastnú jarnú aplikáciu, potom sa to trochu uľahčí - už nepotrebujeme spustený server.

Implementujme veľmi jednoduchý príklad aplikácie: iba radič s metódou, ktorá prijíma text, a jednu stránku HTML s formulárom. Používateľ môže do formulára vložiť text, formulár odoslať a text sa zobrazí pod týmto formulárom.

V tomto prípade použijeme pre túto stránku HTML šablónu Thymeleaf (kompletný príklad Thymeleaf si môžete pozrieť tu):

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (classes = {TestConfig.class}) verejná trieda HtmlUnitAndSpringTest {@Autowired private WebApplicationContext wac; súkromný WebClient webClient; @ Pred public void setup () {webClient = MockMvcWebClientBuilder .webAppContextSetup (wac) .build (); } @Test public void givenAMessage_whenSent_thenItShows () vyvolá výnimku {String text = "Hello world!"; Stránka HtmlPage; Reťazec url = "// localhost / message / showForm"; page = webClient.getPage (url); HtmlTextInput messageText = page.getHtmlElementById ("správa"); messageText.setValueAttribute (text); HtmlForm form = page.getForms (). Get (0); HtmlSubmitInput submit = form.getOneHtmlElementByAttribute ("vstup", "typ", "odoslať"); HtmlPage newPage = submit.click (); Reťazec receiveText = newPage.getHtmlElementById ("prijatý") .getTextContent (); Assert.assertEquals (receiveText, text); }}

Kľúčom je tu budova Webový klient objekt pomocou MockMvcWebClientBuilder z WebApplicationContext. Vďaka Webový klient, môžeme získať prvú stránku navigácie (všimnite si, ako ju obsluhuje localhost) a odtiaľ začnite prehliadať.

Ako vidíte, test analyzuje formulár, ktorý zadá správu (do poľa s ID „správa“), odošle formulár a na novej stránke potvrdí, že prijatý text (pole s ID „prijaté“) je rovnaký ako text, ktorý sme predložili.

8. Záver

HtmlUnit je vynikajúci nástroj, ktorý vám umožní ľahko otestovať vaše webové aplikácie, vyplniť polia formulárov a odoslať ich, akoby ste web používali v prehliadači.

Integruje sa bezproblémovo s Spring 4 a spolu s Spring MVC Test framework vám poskytujú veľmi výkonné prostredie na vykonávanie integračných testov všetkých vašich stránok aj bez webového servera.

Pomocou HtmlUnit tiež môžete automatizovať všetky úlohy súvisiace s prehliadaním webu, ako je načítanie, analýza, ukladanie a analýza údajov (web scraping).

Kód získate na stránkach Github.


$config[zx-auto] not found$config[zx-overlay] not found