wake-up-neo.com

Verwenden von XPATH zum Durchsuchen von Text, der nbsp enthält;

Ich benutze XPather Browser , um meine XPATH-Ausdrücke auf einer HTML-Seite zu überprüfen.

Mein Endziel ist es, diese Ausdrücke in Selen für das Testen meiner Benutzeroberflächen zu verwenden.

Ich habe eine HTML-Datei mit ähnlichem Inhalt erhalten:

 <tr> 
 <td> abc </ td> 
 <td> nbsp; </ td> 
 </ tr> 

Ich möchte einen Knoten mit einem Text auswählen, der die Zeichenfolge "&nbsp;" Enthält.

Mit einer normalen Zeichenfolge wie "abc" gibt es kein Problem. Ich verwende einen XPATH, der //td[text()="abc"] ähnelt.

Wenn ich es mit einem XPATH wie //td[text()="&nbsp;"] versuche, gibt es nichts zurück. Gibt es eine Sonderregel für Texte mit "&"?

112
Bergeroy

Es scheint, dass OpenQA , Leute hinter Selen, dieses Problem bereits angesprochen haben. Sie haben einige Variablen definiert, die explizit mit Leerzeichen übereinstimmen. In meinem Fall muss ich einen XPATH verwenden, der //td[text()="${nbsp}"] ähnelt.

Ich habe hier den Text von OpenQA zu diesem Thema reproduziert (gefunden hier ):

HTML normalisiert automatisch Leerzeichen in Elementen, ignoriert führende/nachfolgende Leerzeichen und konvertiert zusätzliche Leerzeichen, Tabulatoren und Zeilenumbrüche in ein einzelnes Leerzeichen. Wenn Selenium Text aus der Seite liest, versucht es, dieses Verhalten zu duplizieren, sodass Sie alle Tabulatoren und Zeilenumbrüche in Ihrem HTML-Code ignorieren und Behauptungen basierend auf der Darstellung des Texts im Browser beim Rendern vornehmen können. Dazu ersetzen wir alle nicht sichtbaren Leerzeichen (einschließlich des geschützten Leerzeichens "&nbsp;") Durch ein einzelnes Leerzeichen. Alle sichtbaren neuen Zeilen (<br>, <p> Und <pre> Formatierte neue Zeilen) sollten beibehalten werden.

Wir verwenden dieselbe Normalisierungslogik für den Text von HTML-Selenese-Testfalltabellen. Dies hat eine Reihe von Vorteilen. Zunächst müssen Sie sich nicht die HTML-Quelle der Seite ansehen, um herauszufinden, wie Ihre Behauptungen lauten sollten. "&nbsp;" - Symbole sind für den Endbenutzer unsichtbar, sodass Sie sich beim Schreiben von Selenese-Tests keine Sorgen machen sollten. (Sie müssen in Ihrem Testfall keine "&nbsp;" - Marker setzen, um Text in einem Feld zu aktivieren, das "&nbsp;" Enthält.) Sie können auch zusätzliche Zeilenumbrüche und Leerzeichen in Ihr Selenese einfügen <td> Tags; Da für den Testfall dieselbe Normalisierungslogik wie für den Text verwendet wird, können wir sicherstellen, dass die Zusicherungen und der extrahierte Text genau übereinstimmen.

Dies führt in den seltenen Fällen zu Problemen, in denen Sie wirklich zusätzliche Leerzeichen in Ihren Testfall einfügen möchten/müssen. Möglicherweise müssen Sie beispielsweise folgenden Text in ein Feld eingeben: "foo". Wenn Sie jedoch einfach <td>foo </td> In Ihren Selenese-Testfall schreiben, werden Ihre zusätzlichen Leerzeichen durch nur ein Leerzeichen ersetzt.

Dieses Problem lässt sich einfach umgehen. Wir haben eine Variable in Selenese definiert, ${space}, Deren Wert ein einzelnes Leerzeichen ist. Sie können ${space} Verwenden, um ein Leerzeichen einzufügen, das nicht automatisch abgeschnitten wird, wie folgt: <td>foo${space}${space}${space}</td>. Wir haben auch eine Variable ${nbsp} Eingefügt, mit der Sie ein nicht unterbrechendes Leerzeichen einfügen können.

Beachten Sie, dass XPaths Whitespaces nicht wie wir normalisieren . Wenn Sie einen XPath wie //div[text()="hello world"] schreiben müssen, der HTML-Code des Links jedoch wirklich "hello&nbsp;world" Lautet, müssen Sie einen echten "&nbsp;" In Ihren Code einfügen Selenese-Testfall, um eine Übereinstimmung zu erzielen: //div[text()="hello${nbsp}world"].

87
Bergeroy

Ich habe festgestellt, dass ich die Übereinstimmung herstellen kann, wenn ich ein hartcodiertes, nicht unterbrechendes Leerzeichen (U + 00A0) eingebe, indem ich unter Windows Alt + 0160 zwischen den beiden Anführungszeichen eingebe ...

//table[@id='TableID']//td[text()=' ']

arbeitete für mich mit dem Sonderzeichen.

Soweit ich weiß, unterstützt der XPath 1.0-Standard keine Escapezeichen für Unicode-Zeichen. Es scheint Funktionen dafür in XPath 2.0 zu geben, aber es sieht so aus, als ob Firefox dies nicht unterstützt (oder ich habe etwas falsch verstanden). Du hast also mit lokaler Codepage zu tun. Hässlich, ich weiß.

Eigentlich sieht es so aus, als ob der Standard sich auf die Programmiersprache verlässt, die XPath verwendet, um die richtige Unicode-Escape-Sequenz bereitzustellen ... Also habe ich irgendwie das Richtige getan.

24
PhiLho

Versuchen Sie es mit der dezimalen Entität &#160; Anstelle der benannten Entität. Wenn dies nicht funktioniert, sollten Sie in der Lage sein, einfach das nicode-Zeichen für ein nicht unterbrechendes Leerzeichen anstelle der Entität &nbsp; Zu verwenden.

(Hinweis: Ich habe dies nicht in XPather ausprobiert, aber ich habe es in Oxygen ausprobiert.)

4
James Sulak

Beachten Sie, dass ein standardkonformer XML-Prozessor alle Entitätsreferenzen ersetzt hat, die nicht die fünf Standardreferenzen von XML sind (&amp;, &gt;, &lt;, &apos;, &quot;) mit dem entsprechenden Zeichen in der Zielkodierung bis zur Auswertung der XPath-Ausdrücke. Angesichts dieses Verhaltens sind die Vorschläge von PhiLho und jsulak der richtige Weg, wenn Sie mit XML-Tools arbeiten möchten. Wenn Du eintrittst &#160; im XPath-Ausdruck sollte es in die entsprechende Byte-Sequenz konvertiert werden, bevor der XPath-Ausdruck angewendet wird.

2
ChuckB

Ich kann mit Xpather keine Übereinstimmung erzielen, aber das Folgende funktionierte bei mir mit einfachen XML- und XSL-Dateien im XML-Editor von Microsoft:

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

Der zurückgegebene Wert ist 1, was in meinem Testfall der richtige Wert ist.

Allerdings musste ich nbsp als Entität in meinem XML- und XSL-Code wie folgt deklarieren:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

Ich bin nicht sicher, ob Ihnen das hilft, aber ich konnte tatsächlich nbsp mithilfe eines XPath-Ausdrucks finden.

Bearbeiten: Mein Codebeispiel enthält tatsächlich die Zeichen 'nbsp;', aber die Hervorhebung der JavaScript-Syntax konvertiert sie in das Leerzeichen. Lass dich nicht in die Irre führen!

1
Zack The Human

Suchen nach &nbsp; oder nur nbsp - hast du das versucht?

1
roni