2015-10-16 13 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秒ほど後にjava.net.ConnectException: Connection timed outオフ、によって引き起こさcom.jayway.restassured.path.xml.exception.XmlPathException: Failed to parse the XML documentに終了します!

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>"でテストが失敗しますが、それは明らかに別の問題です(ただし、 ...)。とにかくdoctypeを削除することは私の選択肢ではありません。

質問:どのようにして、REST保証を使用してDoctypeでHTML文書のプロパティをチェックしますか? in the documentationは、「REST保証プロバイダは、HTML、XML、JSONなどの事前定義済みパーサー」と述べていますが、そのHTMLパーサーをどのように有効にして使用するかについての例は見当たりません。たとえば、XmlPathのような "HtmlPath"クラスはありません。そのタイムアウト例外は非常に困惑しています...

答えて

3

あなたのコードを確認しました。 XmlPath RestassuredはXpathではありませんが、プロパティアクセス構文を使用しています。ボディコンテンツをサンプルHTMLに追加すると、XPathがあまり効果がないことがわかります。クエリ言語の実際の名前はGPathです。あなたはその後、CompatibilityMode.HTMLとXmlPathが使用されている(とき/そして/与えられた)DSLを使用している場合

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

クール、ありがとうございました!魅力のように働くようですが、私はあなたに賞金を授与させていただきます。 :)あなたが気にしない場合、もう1つの質問:プロパティアクセス構文では、任意のIDまたはクラスを持つ要素を見つけて、その内容をアサートすることは可能ですか? – ZeroOne

+0

@上記の更新された回答をご覧ください。 –

+0

さて、ありがとう!ここでは、upv​​oteも持っています。 :) – ZeroOne

5

次の例では、またノートあなたが必要とするために右の設定を持っているCompatibilityMode.HTMLの使用を働きます応答コンテンツタイプのヘッダーにhtml互換メディアタイプ(text/htmlなど)が含まれている場合、自動的に

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

、あなたはこのようにタイトルと本文を検証することができます:たとえば/index.htmlは、次のHTMLページが含まれている場合

when(). 
     get("/index.html"). 
then(). 
     statusCode(200). 
     body("html.title", equalTo("My page"), 
      "html.body", equalTo("Something")); 
関連する問題