13.6. Anführungszeichen in Suchbegriffen

Unterschiedliche Arten von Anführungszeichen

Wichtiger Hinweis: Der Begriff Anführungszeichen wird in Texten unterschiedlich umgesetzt, wie das folgende Bild zeigt:

“Englische“ und „deutsche“ Anführungszeichen stören nicht während der Ausführung von Tests. Lediglich bei ihrer Erstellung könnten Sie das Problem haben, sie in Ihren Editor zu bekommen. Tipp: kopieren Sie die gewünschten Anführungszeichen von einem Textverarbeitungsprogramm oder einem bestehenden PDF-Dokument und fügen Sie sie dann in Ihre Datei ein.

Die "programmers double quotes" benötigen eine besondere Aufmerksamkeit, weil sie in Java als Zeichenkettenbegrenzer dienen. Die nachfolgenden Absätze und Beispiele gehen detailiert darauf ein, sie basieren alle auf dem folgenden Dokument:

Gültige Beispiele

'Single-Quotes', “englische“ und „deutsche“ Anführungszeichen innerhalb von Zeichenketten bereiten alle keine Probleme, lediglich "Double-Quotes" müssen mit einem Backslash maskiert werden:

@Test
public void hasText_SingleQuotes() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String expected = "Example 1: 'single quotes'";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .containing(expected)
  ;
}
@Test
public void hasText_GermanDoubleQuotes() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String expected = "Example 2: „German double quotes“";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .containing(expected)
  ;
}
@Test
public void hasText_EnglishDoubleQuotes() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String expected = "Example 3: “English double quotes“";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .containing(expected)
  ;
}
@Test
public void hasText_ProgrammersDoubleQuotes() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String expected = "Example 4: \"programmers double quotes\"";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .containing(expected)
  ;
}
@Test
public void hasText_DoubleAndSingleQuotes_1() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String expected = "Example 5: \"double quotes outside, 'single quotes' inside\"";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .containing(expected)
  ;
}
@Test
public void hasText_DoubleAndSingleQuotes_2() throws Exception {
  String filename = "documentUnderTest.pdf";
  String expected = "Example 6: 'single quotes outside, \"double quotes\" inside'";
  
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .containing(expected)
  ;
}
@Test
public void matchingRegex_DoubleQuotes() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .hasText()
            .matchingRegex(".*\"double.*\".*")
  ;
}

Anführungszeichen innerhalb von XPath-Ausdrücken

Zeichenketten, die im Laufe der Verarbeitung mit XPath weiterverarbeitet werden, dürfen nicht gleichzeitig Single- und Double-Quotes enthalten. Diese Bedingung ist im folgenden Beispiel verletzt:

@Test
public void matchingXPath_DoubleQuotes_1() throws Exception {
  String filename = "documentUnderTest.pdf";
  String xpath = "count(//Title[.='\"Double Quote\"-Chapter']) = 1";
  XPathExpression xpathExpression = new XPathExpression(xpath);
  
  AssertThat.document(filename)
            .hasBookmarks()
            .matchingXPath(xpathExpression)
  ;
}

Der Fehler lässt sich nur vermeiden, wenn die XPath-Bedingung anders formuliert wird:

@Test
public void matchingXPath_DoubleQuotes_2() throws Exception {
  String filename = "documentUnderTest.pdf";
  String xpath1 = "count(//Title[contains(., 'Double Quote')]) = 1";
  String xpath2 = "count(//Title[contains(., 'Chapter')]) = 4";
  XPathExpression xpathExpression1 = new XPathExpression(xpath1);
  XPathExpression xpathExpression2 = new XPathExpression(xpath2);
  
  AssertThat.document(filename)
            .hasBookmarks()
            .matchingXPath(xpathExpression1)
            .matchingXPath(xpathExpression2)
  ;
}