2015-10-16 10 views
5

Sto tentando di utilizzare REST Assured per controllare alcune proprietà su un documento HTML restituito dal mio server. Un SSCCE dimostrando il problema sarebbe la seguente:Controllo del documento HTML con REST Assured

import static com.jayway.restassured.path.xml.config.XmlPathConfig.xmlPathConfig; 
import static org.hamcrest.CoreMatchers.is; 
import static org.junit.Assert.assertThat; 

import org.junit.Test; 

import com.jayway.restassured.path.xml.XmlPath; 

public class HtmlDocumentTest { 

    @Test 
    public void titleShouldBeHelloWorld() { 
    final XmlPath xml = new XmlPath("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" 
     + "<html xmlns=\"http://www.w3.org/1999/xhtml\">" 
     + "<head><title>Hello world</title></head><body></body></html>") 
     .using(xmlPathConfig().with().feature("http://apache.org/xml/features/disallow-doctype-decl", false)); 
    assertThat(xml.get("//title[text()]"), is("Hello world")); 
    } 
} 

Ora, questo tentativo finisce in com.jayway.restassured.path.xml.exception.XmlPathException: Failed to parse the XML document causati da, fuori tutti i possibili errori, java.net.ConnectException: Connection timed out dopo circa 30 secondi o giù di lì!

Se si rimuove la linea con xmlPathConfig().with().feature(...), il test ha esito negativo immediatamente a causa di DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true..

Se rimuovo la riga doctype dal documento l'analisi ha esito positivo ma il test non riesce su un errore di asserzione, "Expected: is "Hello world" but: was <Hello worldnull>" - tuttavia, questo è un problema diverso, ovviamente (ma sentiti libero di dare istruzioni anche su quello ...). E la rimozione del doctype non è comunque un'opzione per me.

Quindi, domanda: come si controllano le proprietà di un documento HTML con un doctype utilizzando REST Assured? Dice in the documentation che "REST i parser predefiniti dei provider garantiti per ad esempio HTML, XML e JSON.", ma non riesco a trovare alcun esempio su come esattamente attivare e lavorare con quel parser HTML! Non esiste una classe "HtmlPath" come ad esempio c'è XmlPath e quell'eccezione di timeout è molto sconcertante ...

risposta

3

Ho controllato il tuo codice. Il fatto è che XmlPath of Restassured non è Xpath, ma usa una sintassi di accesso alle proprietà. Se aggiungi un contenuto del corpo al tuo HTML di esempio, vedrai che il tuo XPath non fa molto. Il nome effettivo della lingua di query è GPath. Il seguente esempio funziona, nota anche l'uso di CompatibilityMode.HTML, che ha la configurazione giusta per il necessario:

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 
import com.jayway.restassured.path.xml.XmlPath; 
import com.jayway.restassured.path.xml.XmlPath.CompatibilityMode; 

public class HtmlDocumentTest { 

    @Test 
    public void titleShouldBeHelloWorld() { 
     XmlPath doc = new XmlPath(
       CompatibilityMode.HTML, 
       "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" 
         + "<html xmlns=\"http://www.w3.org/1999/xhtml\">" 
         + "<head><title>Hello world</title></head>" 
         + "<body>some body" 
         + "<div class=\"content\">wrapped</div>" 
         + "<div class=\"content\">wrapped2</div>" 
         + "</body></html>"); 

     String title = doc.getString("html.head.title"); 
     String content = doc.getString("html.body.div.find { [email protected] == 'content' }"); 
     String content2 = doc.getString("**.findAll { [email protected] == 'content' }[1]"); 

     assertEquals("Hello world", title); 
     assertEquals("wrapped", content); 
     assertEquals("wrapped2", content2); 
    } 
} 
+0

fresco, grazie! Sembra funzionare come un incantesimo, sono felice di premiarti la taglia. :) Un'ulteriore domanda, però, se non ti dispiace: con la sintassi di accesso alle proprietà, è possibile in alcun modo trovare un elemento con un determinato ID o classe e quindi asserire il suo contenuto? – ZeroOne

+0

@vedi risposta aggiornata sopra. –

+0

Ok, grazie! Anche qui, hai un upvote. :) – ZeroOne

5

Se si sta utilizzando il DSL (data/quando/allora) poi XmlPath con CompatibilityMode.HTML viene utilizzato automaticamente se l'intestazione del tipo di contenuto della risposta contiene un tipo di supporto compatibile html (ad esempio text/html). Per esempio, se /index.html contiene la seguente pagina HTML:

<html> 
    <title>My page</title> 
    <body>Something</body> 
</html> 

allora si può convalidare il titolo e il corpo in questo modo:

when(). 
     get("/index.html"). 
then(). 
     statusCode(200). 
     body("html.title", equalTo("My page"), 
      "html.body", equalTo("Something")); 
Problemi correlati