Ich habe ein Problem bei der Auswahl von Knoten nach Attributen, wenn die Attribute mehr als ein Wort enthalten. Zum Beispiel:
<div class="atag btag" />
Dies ist mein xpath-Ausdruck:
//*[@class='atag']
Der Ausdruck funktioniert mit
<div class="atag" />
aber nicht für das vorherige Beispiel. Wie kann ich das auswählen <div>
?
div.atag
oderdiv.btag
. Super einfach, kein String-Matching und viel schneller (und besser in Browsern unterstützt). XPath (gegen HTML) sollte auf das verwiesen werden, was es nützlich ist, um ... Elemente durch enthaltenen Text zu finden und für die DOM-Navigation.Antworten:
Hier ist ein Beispiel, das div-Elemente findet, deren Klassenname enthält
atag
:Hier ist ein Beispiel, das div-Elemente findet, deren Klassenname
atag
und enthältbtag
:Es werden jedoch auch teilweise Übereinstimmungen wie gefunden
class="catag bobtag"
.Wenn Sie keine Teilübereinstimmungen wünschen, lesen Sie die Antwort von Bobince weiter unten.
quelle
<div class="Patagonia Halbtagsarbeit">
, das die Zielzeichenfolgen enthält, aber kein div mit den angegebenen Klassen ist.Die Antwort von mjv ist ein guter Anfang, schlägt jedoch fehl, wenn atag nicht der erste aufgeführte Klassenname ist.
Der übliche Ansatz ist der eher unhandliche:
Dies funktioniert so lange, wie Klassen nur durch Leerzeichen und nicht durch andere Formen von Leerzeichen getrennt sind. Dies ist fast immer der Fall. Wenn dies nicht der Fall ist, müssen Sie es noch unhandlicher machen:
(Die Auswahl durch klassennamenähnliche, durch Leerzeichen getrennte Zeichenfolgen ist ein so häufiger Fall, dass es überraschend ist, dass es keine spezifische XPath-Funktion dafür gibt, wie z. B. CSS3s '[class ~ = "atag"]'.)
quelle
Versuche dies:
//*[contains(@class, 'atag')]
quelle
EDIT : siehe bobince-Lösung , die Anwendungen enthalten , anstatt Anfahren mit , zusammen mit einem Trick des Vergleich zu gewährleisten , ist auf der Ebene eines vollständigen Token gemacht (damit die ‚atag‘ Muster als Teil eines anderen ‚Tages‘ zu finden).
"atag btag" ist ein ungerader Wert für das Klassenattribut, aber versuchen Sie trotzdem:
quelle
Ein 2.0 XPath, der funktioniert:
oder mit einer Variablen:
quelle
@class
mehr als ein Element vorhanden ist? Weil es eine Liste von Wörtern zurückgeben wird und der Vergleich mit einer Zeichenfolge mit falscher Kardinalität fehlschlägt .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Beachten Sie, dass die Antwort von Bobince möglicherweise zu kompliziert ist, wenn Sie davon ausgehen können, dass der Klassenname , an dem Sie interessiert sind, keine Teilzeichenfolge eines anderen möglichen Klassennamens ist . Wenn dies zutrifft, können Sie einfach den Teilstring-Abgleich über die Funktion enthält verwenden. Folgendes passt zu jedem Element, dessen Klasse den Teilstring 'atag' enthält:
Wenn die obige Annahme nicht zutrifft, stimmt eine Teilzeichenfolgenübereinstimmung mit Elementen überein, die Sie nicht beabsichtigen. In diesem Fall müssen Sie die Wortgrenzen finden. Durch die Verwendung der Leerzeichenbegrenzer zum Ermitteln der Klassennamengrenzen findet die zweite Antwort von Bobince die genauen Übereinstimmungen:
Dies wird übereinstimmen
atag
und nichtmatag
.quelle
So fügen Sie die Antwort von Bobince hinzu ... Wenn das von Ihnen verwendete Tool / die Bibliothek Xpath 2.0 verwendet, können Sie auch Folgendes tun:
count () wird anscheinend benötigt, da index-of () eine Sequenz jedes Index zurückgibt, bei dem eine Übereinstimmung in der Zeichenfolge vorliegt.
quelle
$classname
Variable NICHT zwischen Anführungszeichen setzen? Denn so wie es ist, ist das eine Zeichenfolge.'$classname'
natürlich.Sie können Folgendes versuchen
By.CssSelector("div.atag.btag")
quelle
Ich bin hierher gekommen, um nach einer Lösung für Ranorex Studio 9.0.1 zu suchen. Es gibt dort noch kein enthält (). Stattdessen können wir Regex verwenden wie:
quelle
Für die Links, die eine gemeinsame URL enthalten, muss eine Variable konsolidiert werden. Versuchen Sie es dann nacheinander.
quelle