2008-10-29 6 views
101

enthält Ich verwende XPather Browser, um meine XPATH-Ausdrücke auf einer HTML-Seite zu überprüfen.XPATH verwenden, um Text zu suchen, der  

Mein Endziel ist es, diese Ausdrücke in Selenium zum Testen meiner Benutzeroberflächen zu verwenden.

Ich habe eine HTML-Datei mit einem Inhalt ähnlich, dies zu:

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

ich einen Knoten mit einem Text auswählen möchten die Zeichenfolge „&nbsp;“ enthält.

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

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

+0

Gibt Ihre tatsächliche XSL-Transformation nichts zurück? Oder nur Xpather? –

Antwort

82

Es scheint, dass , Jungs hinter Selen, dieses Problem bereits angesprochen haben. Sie haben einige Variablen definiert, die explizit den Leerzeichen entsprechen. In meinem Fall muss ich einen XPATH ähnlich //td[text()="${nbsp}"] verwenden.

ich reproduziert hier den Text aus OpenQA dieses Thema betreffend (here gefunden):

HTML normalisiert automatisch Leerzeichen, innerhalb von Elementen führende/nachfolgende Leerzeichen ignoriert und Umwandlung zusätzliche Leerzeichen, Tabulatoren und Zeilenumbrüche in ein einzelnes Leerzeichen. Wenn Selen Text liest aus der Seite, versucht es zu dieses Verhalten duplizieren, so können Sie ignorieren alle Tabs und Zeilenumbrüche in Ihre HTML und tun basiert Behauptungen auf , wie der Text im Browser aussieht, wenn gemacht. Dazu werden alle nicht sichtbaren Leerzeichen (einschließlich nicht-brechendes Leerzeichen "&nbsp;") durch ein einzelnes Leerzeichen ersetzt. Alle sichtbaren Zeilenumbrüche (<br>, <p> und <pre> formatierte neue Zeilen) sollten beibehalten werden.

Wir verwenden die gleiche Normalisierungslogik auf den Text von HTML Selenese Testfall Tabellen. Dies hat eine Reihe von Vorteile. Zuerst müssen Sie nicht Blick auf die HTML-Quelle der Seite zu herausfinden, was Ihre Behauptungen sein sollten; "&nbsp;" Symbole sind unsichtbar für den Endbenutzer, und so sollten Sie nicht über sie beim Schreiben Selenese Tests kümmern. (Sie brauchen nicht „&nbsp;“ Marker in Ihrem Testfall zu assertText auf einem Feld zu setzen, die „&nbsp;“ enthält.) Sie können auch zusätzliche setzen können Zeilenumbrüche und Leerzeichen in Selenese <td> Tags; Da wir die gleiche Normalisierungslogik für den Testfall wie wir auf den Text verwenden, können wir sicherstellen, dass Assertions und der extrahierte Text wird genau übereinstimmen.

Dies schafft ein bisschen ein Problem auf jene seltenen Gelegenheiten, wenn Sie wirklich wollen/müssen zusätzliche Leerzeichen in Ihrem Testfall einzufügen. Zum Beispiel haben Sie möglicherweise Text in einem Feld wie eingeben müssen dies: "foo". Aber wenn Sie einfach schreiben <td>foo </td> in Ihrem Selenese Testfall, ersetzen wir Ihre zusätzliche Leerzeichen mit nur einem Leerzeichen.

Dieses Problem hat eine einfache Problemumgehung. Wir haben eine Variable in Selenese, ${space} definiert, deren Wert ist ein einzelner Raum. Sie können ${space} zu einfügen einen Raum, der nicht automatisch getrimmt wird, wie folgt: <td>foo${space}${space}${space}</td>. Wir haben auch eine Variable ${nbsp} enthalten, die Sie verwenden können, um ein nicht brechendes Leerzeichen einzufügen.

Beachten Sie, dass XPaths nicht normalisieren Leerzeichen wie wir tun. Wenn Sie benötigen einen XPath wie //div[text()="hello world"] aber die HTML-Code der Link zu schreiben ist wirklich „hello&nbsp;world“, werden Sie zu benötigen einfügen eine echte „&nbsp;“ in Ihren Selenese Testfall, um es anzupassen zu bekommen, so: //div[text()="hello${nbsp}world"].

0

Suchen Sie nach &nbsp; oder nur nbsp - haben Sie das versucht?

+0

Ich weiß, dass das funktionieren sollte, aber es ist nicht genau sicher, was ich finde. Es muss einen Weg in XPATH geben, um einen bestimmten Weg zu kodieren, um zu dem zu passen, wonach ich suche. – Bergeroy

+0

Vielleicht sollte ich auf einen regulären Ausdruck schauen. – Bergeroy

3

Versuchen Sie, die Dezimalstelle &#160; anstelle der benannten Entität zu verwenden. Wenn das nicht funktioniert, sollten Sie einfach die unicode character for a non-breaking space anstelle der &nbsp; Einheit verwenden können.

. (Anmerkung: Ich habe nicht versuchen, dies in XPather, aber ich habe es in Sauerstoff versuchen)

16

fand ich, dass ich das Spiel machen kann, wenn ich Eingang einen hartcodierte non-breaking Raum (U + 00A0) durch Eingabe von Alt + 0160 unter Windows zwischen den beiden Anführungszeichen ...

arbeitete für mich mit dem speziellen char.

Von dem, was ich verstanden habe, behandelt der XPath 1.0-Standard keine Unicode-Zeichen. Es scheint Funktionen in XPath 2.0 dafür zu geben, aber es sieht so aus, als ob Firefox es nicht unterstützt (oder ich etwas falsch verstanden habe). Sie haben also mit der lokalen Codepage zu tun. Hässlich, ich weiß.

Eigentlich sieht es so aus, als ob der Standard auf die Programmiersprache angewiesen ist, die XPath verwendet, um die korrekte Unicode-Escape-Sequenz bereitzustellen ... Also, irgendwie habe ich das Richtige getan.

+0

Mit Xpather 1.4.1 in Firefox 2, // td [text() = ''] ergibt keine Ergebnisse. –

+0

Entschuldigung. Es funktioniert nicht für mich. Mein Endziel ist, es in Selenium für die Tests meiner Webschnittstellen zu verwenden. Selen selbst behält die Testausdrücke in einer XML-Struktur und die Alt-Windows-Typisierung scheint in der Art verloren zu sein. Auch meine   gibt als in XML zurück. – Bergeroy

+0

Zack, wie ich geschrieben habe, müssen Sie den Abstand zwischen den beiden Anführungszeichen durch das Zeichen ersetzen, das von Alt + 0160 (auf der numerischen Tastatur) erzeugt wird. – PhiLho

1

Ich kann keine Übereinstimmung mit Xpather bekommen, aber die folgenden für mich mit einfachen XML und XSL-Dateien in Microsoft XML Notepad gearbeitet:

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

Der Rückgabewert 1 ist, was der richtige Wert in meinem Test ist Fall.

Allerdings habe ich nbsp als Einheit in meiner XML und XSL mit dem folgenden erklären:

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

Ich bin mir nicht sicher, ob das Ihnen hilft, aber ich war in der Lage zu tatsächlich finden nbsp mit einem XPath-Ausdruck.

Bearbeiten: Mein Codebeispiel enthält tatsächlich die Zeichen '& nbsp;', aber die JavaScript-Syntax hebt es in das Leerzeichen um. Nicht in die Irre führen!

+0

Sie können Ihre Codebeispiel bearbeiten, wie es für das Beispiel in meiner Frage getan wurde. Ersetzen Sie Ihre Entity durch & nbsp ;. – Bergeroy

1

Beachten Sie, dass ein standardkonformen XML-Prozessor alle Entity-Referenzen haben ersetzt werden andere als fünf XML-Standard diejenigen (&amp;, &gt;, &lt;, &apos;, &quot;) mit dem entsprechenden Zeichen in der Zielcodierung durch die Zeit XPath-Ausdrücke werden ausgewertet. Angesichts dieses Verhaltens sind die Vorschläge von PhiLho und jsulak der richtige Weg, wenn Sie mit XML-Tools arbeiten möchten. Wenn Sie im XPath-Ausdruck &#160; eingeben, sollte es in die entsprechende Byte-Sequenz konvertiert werden, bevor der XPath-Ausdruck angewendet wird.

+1

Nicht, wenn Sie XPath in XPather (GUI) oder in JavaScript versuchen/verwenden (keine automatische Substitution von Entitäten, da wir nicht in XML sind). Guter Rat in anderen XML-Umgebungen (XSTL?). – PhiLho