Bevezetés a HtmlUnit-be

1. Bemutatkozás

Ebben a cikkben bemutatjuk a HtmlUnit eszközt, amely lehetővé teszi számunkra, hogy egyszerűen programozottan interakcióba lépni és tesztelni egy HTML-webhelyet, JAVA API-k segítségével.

2. A HtmlUnit névjegye

A HtmlUnit egy GUI nélküli böngésző - egy olyan böngésző, amelyet programozottan, nem pedig közvetlenül a felhasználó számára használnak.

A böngésző támogatja a JavaScript-et (a Mozilla Rhino motoron keresztül), és még összetett AJAX funkciókkal rendelkező webhelyek esetén is használható. Mindez elvégezhető egy tipikus GUI alapú böngésző, például a Chrome vagy a Firefox szimulálásával.

A HtmlUnit név arra késztetheti Önt, hogy ez egy tesztelési keretrendszer, de bár feltétlenül használható tesztelésre, ennél sokkal többre képes.

A Spring 4-be is integrálták, és a Spring MVC Test keretrendszerrel együtt zökkenőmentesen használhatók.

3. Letöltés és Maven-függőség

A HtmlUnit letölthető a SourceForge-ból vagy a hivatalos weboldalról. Ezenkívül felveheti az építőeszközébe (például Maven vagy Gradle), ahogy itt láthatja. Például ez az a Maven-függőség, amelyet jelenleg beilleszthet a projektjébe:

 net.sourceforge.htmlunit htmlunit 2.23 

A legújabb verzió itt található.

4. Web tesztelés

Sokféleképpen tesztelhet egy webalkalmazást - amelyek többségét itt vagy a webhelyen ismertettük egy-egy ponton.

A HtmlUnit segítségével közvetlenül elemezheti a webhely HTML-kódját, kölcsönhatásba léphet vele, mint egy normál felhasználó a böngészőből, ellenőrizheti a JavaScript és a CSS szintaxisát, űrlapokat küldhet be és elemezheti a válaszokat a HTML-elemek tartalmának megtekintéséhez. Mindezt tiszta Java kód használatával.

Kezdjük egy egyszerű teszttel: hozzunk létre egy Web Ügyfél és megkapja a navigáció első oldalát www.baeldung.com:

privát WebClient webClient; @A nyilvános void előtt az init () kiveti a {webClient = new WebClient () kivételt; } @A nyilvános void bezárás () után a Kivétel {webClient.close () dobja; } @Test public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk () dobja a kivétel HtmlPage oldalát = webClient.getPage ("/"); Assert.assertEquals ("Baeldung 

Láthat néhány figyelmeztetést vagy hibát a teszt futtatásakor, ha webhelyünknek vannak JavaScript vagy CSS problémái. Javítanod kellene őket.

Néha, ha tudja, mit csinál (például, ha úgy látja, hogy egyetlen hibája harmadik féltől származó JavaScript könyvtárakból származik, amelyeket nem szabad módosítania), akkor megakadályozhatja ezeket a hibákat a teszt sikertelenségében, setThrowExceptionOnScriptError val vel hamis:

@Test public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect () dobja a kivétel Java, Spring és Web Development oktatóprogramokat ", page.getTitleText ()); 

5. Webes kaparás

Nem kell csak a saját webhelyeihez használni a HtmlUnit szoftvert. Végül is ez egy böngésző: használhatja bármilyen tetszőleges weben való navigáláshoz, adatok küldéséhez és letöltéséhez, ha szükséges.

Webhelyek adatainak lekérése, elemzése, tárolása és elemzése a webes kaparás néven ismert folyamat, és a HtmlUnit segíthet az alkatrészek beolvasásában és elemzésében.

Az előző példa azt mutatja be, hogy miként léphetünk be bármilyen weboldalra és navigálhatunk azon keresztül, megszerezve az összes kívánt információt.

Például nézzük meg a Baeldung teljes cikkarchívumát, keresse meg a legújabb cikket, és töltse le a címét (először

címke). Tesztünkhöz ez elég lesz; de ha további információkat akartunk tárolni, lekérhettük például a címsorokat (mind

címkék) is, így alapvető elképzelésük van arról, hogy miről szól a cikk.

Könnyű megszerezni az elemeket azonosítójuk alapján, de általában, ha olyan elemet kell találni, amelyik kényelmesebb használja az XPath szintaxist. A HtmlUnit lehetővé teszi számunkra a használatát, így fogjuk is.

@Test public void givenBaeldungArchive_whenRetrievingArticle_thenHasH1 () dobja a Kivételt {webClient.getOptions (). SetCssEnabled (hamis); webClient.getOptions (). setJavaScriptEnabled (hamis); Karakterlánc URL = "/ teljes_archívum"; HtmlPage page = webClient.getPage (url); String xpath = "(// ul [@ class = 'car-monthlisting'] / li) [1] / a"; HtmlAnchor latestPostLink = (HtmlAnchor) page.getByXPath (xpath) .get (0); HtmlPage postPage = latestPostLink.click (); H1 lista = (List) postPage.getByXPath ("// h1"); Assert.assertTrue (h1.size ()> 0); } 

Először vegye figyelembe, hogy - ebben az esetben a CSS és a JavaScript nem érdekel bennünket, és csak a HTML elrendezést akarjuk elemezni, ezért kikapcsoltuk a CSS-t és a JavaScript-et.

Egy igazi webes kaparásnál vegye például a h1 és h2 címek, és az eredmény valami ilyesmi lenne:

Java Web Weekly, 135. szám 1. Tavasz és Java 2. Műszaki és Musings 3. Képregények 4. Válaszd ki a hetet

Ellenőrizheti, hogy a lekért információk valóban megfelelnek-e a Baeldung legújabb cikkének:

6. Mi a helyzet az AJAX-szal?

Az AJAX funkciók problémát jelenthetnek, mert a HtmlUnit általában az AJAX-hívások befejezése előtt tölti le az oldalt. Sokszor szükségük van rájuk a webhely megfelelő teszteléséhez vagy a kívánt adatok beolvasásához. Van néhány módszer a kezelésükre:

  • Te tudod használni webClient.setAjaxController (új NicelyResynchronizingAjaxController ()). Ez újraszinkronizálja a fő szálból végrehajtott hívásokat, és ezeket a szinkron módon hajtják végre annak érdekében, hogy stabil állapot legyen tesztelhető.
  • Amikor belép egy webalkalmazás oldalára, várhat néhány másodpercet, így elegendő idő áll rendelkezésre az AJAX-hívások befejezésére. Ennek eléréséhez használhatja webClient.waitForBackgroundJavaScript (MILLIS) vagy webClient.waitForBackgroundJavaScriptStartingBefore (MILLIS). Felhívja őket az oldal lekérése után, de mielőtt dolgozna vele.
  • Várhat, amíg az AJAX-hívás végrehajtásával kapcsolatos várható feltételek teljesülnek. Például:
for (int i = 0; i <20; i ++) {if (feltétel_happen_after_js_ végrehajtás) {break; } szinkronizált (oldal) {oldal.várjon (500); }}
  • Ahelyett, hogy létrehozna egy új Webkliens (), amely alapértelmezés szerint a legjobban támogatott böngésző, próbálkozzon más böngészőkkel, mivel azok jobban működhetnek a JavaScript vagy az AJAX hívásokkal. Például ez létrehoz egy webklienst, amely egy Chrome böngészőt használ:
WebClient webClient = új WebClient (BrowserVersion.CHROME);

7. Példa tavasszal

Ha a saját tavaszi alkalmazásunkat teszteljük, akkor a dolgok egy kicsit könnyebbé válnak - már nincs szükségünk futó szerverre.

Vezessünk be egy nagyon egyszerű példaalkalmazást: csak egy vezérlőt egy metódussal, amely szöveget fogad, és egyetlen HTML oldalt egy űrlappal. A felhasználó beírhat egy szöveget az űrlapba, beküldheti az űrlapot, és a szöveg az űrlap alatt jelenik meg.

Ebben az esetben egy Thymeleaf sablont fogunk használni az adott HTML oldalhoz (a Thymeleaf teljes példáját itt láthatja):

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (class = {TestConfig.class}) public class HtmlUnitAndSpringTest {@Autowired private WebApplicationContext wac; privát WebClient webClient; @A nyilvános void beállítása előtt () {webClient = MockMvcWebClientBuilder .webAppContextSetup (wac) .build (); } @Test public void givenAMessage_whenSent_thenItShows () dobja a Kivételt {String text = "Hello world!"; HtmlPage oldal; String url = "// localhost / message / showForm"; oldal = webClient.getPage (url); HtmlTextInput messageText = page.getHtmlElementById ("üzenet"); messageText.setValueAttribute (text); HtmlForm forma = page.getForms (). Get (0); HtmlSubmitInput submit = form.getOneHtmlElementByAttribute ("input", "type", "submit"); HtmlPage newPage = submit.click (); Karaktersorozat kapottText = newPage.getHtmlElementById ("kapott") .getTextContent (); Assert.assertEquals (kapottText, szöveg); }}

A kulcs itt a Web Ügyfél objektum felhasználásával MockMvcWebClientBuilder tól WebApplicationContext. A ... val Web Ügyfél, megkaphatjuk a navigáció első oldalát (vegye észre, hogyan szolgálja helyi kiszolgáló), és kezdje el a böngészést onnan.

Amint láthatja, a teszt elemzi az űrlapot, amely beír egy üzenetet (egy mezőbe, amelynek azonosítója „üzenet”), beküldi az űrlapot, és az új oldalon azt állítja, hogy a fogadott szöveg ugyanaz, mint a beküldött szöveg.

8. Következtetés

A HtmlUnit egy nagyszerű eszköz, amely lehetővé teszi a webalkalmazások egyszerű tesztelését, az űrlapmezők kitöltését és beküldését, mintha az internetet böngészőben használná.

Zökkenőmentesen integrálódik a Spring 4-be, és a Spring MVC Test keretrendszerrel együtt nagyon hatékony környezetet biztosítanak az összes oldal integrációs tesztjeinek elvégzéséhez webszerver nélkül is.

A HtmlUnit használatával automatizálhat minden, a böngészéssel kapcsolatos feladatot, például az adatok beolvasását, elemzését, tárolását és elemzését (webes kaparás).

A kódot a Github-on keresztül szerezheti be.