2015-10-16 32 views
5

我試圖使用REST Assured來檢查我的服務器返回的HTML文檔的一些屬性。一個SSCCE證明那問題就如下:使用REST確保檢查HTML文檔

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")); 
    } 
} 

現在,這種嘗試有30秒左右的時間以後,結束com.jayway.restassured.path.xml.exception.XmlPathException: Failed to parse the XML document所致,關閉所有可能出現的錯誤,java.net.ConnectException: Connection timed out

如果我用xmlPathConfig().with().feature(...)刪除行,由於DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.,測試立即失敗。

如果我從文檔中刪除doctype行解析成功,但測試失敗的斷言錯誤,「Expected: is "Hello world" but: was <Hello worldnull>」 - 但是,這是一個不同的問題,顯然(但也可以自由地給予指示...)。無論如何,刪除文檔類型對我來說都不是一種選擇。

所以,問題:你如何使用REST Assured檢查帶有文檔類型的HTML文檔的屬性?它說in the documentationREST Assured providers預定義的解析器,例如HTML,XML和JSON。」,但我似乎無法找到關於如何激活和使用該HTML解析器的任何示例!沒有「HtmlPath」類,例如XmlPath,例如,超時異常非常令人費解......

回答

3

我檢查了您的代碼。問題是Restassured的XmlPath不是Xpath,而是使用屬性訪問語法。如果您將正文內容添加到您的示例HTML中,您將看到您的XPath沒有多大作用。查詢語言的實際名稱是GPath。以下示例適用,還要注意使用CompatibilityMode.HTML,其中有正確的配置您需要:

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

酷,謝謝!似乎像一個魅力工作,我很高興獎勵你的賞金。 :)另外一個問題,但是,如果你不介意:使用屬性訪問語法,是否有可能以任何方式找到具有給定ID或類的元素,然後聲明其內容? – ZeroOne

+0

@請參閱上面的更新答案。 –

+0

好的,謝謝!在這裏,還有一個upvote。 :) – ZeroOne

5

如果您使用的是DSL(給定/時/即可),則使用與xmlpath中CompatibilityMode.HTML如果響應內容類型標題包含html兼容介質類型(例如text/html),則自動執行此操作。例如,如果/index.html包含以下HTML頁面:

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

,那麼你可以驗證標題和正文是這樣的:

when(). 
     get("/index.html"). 
then(). 
     statusCode(200). 
     body("html.title", equalTo("My page"), 
      "html.body", equalTo("Something")); 
相關問題