xpath beispiele - Wie kann ich auf ein Attribut, das eine bestimmte Zeichenfolge enthält, abgleichen?





tester c# (9)


Ein 2.0 XPath, der funktioniert:

//*[tokenize(@class,'\s+')='atag']

oder mit einer Variablen:

//*[tokenize(@class,'\s+')=$classname]

Ich habe ein Problem bei der Auswahl von Knoten nach Attribut, wenn die Attribute mehr als ein Wort enthalten. Beispielsweise:

<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 <div> auswählen?




Denn die Links, die eine gemeinsame URL enthalten, müssen in einer Variablen trösten. Dann versuchen Sie es nacheinander.

webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
    driver.findelement(allLinks[i]).click();
}



EDIT : Siehe bobince's Lösung, die contains anstatt start-with verwendet , zusammen mit einem Trick, um sicherzustellen, dass der Vergleich auf der Ebene eines vollständigen Token durchgeführt wird (damit das 'atag'-Muster nicht als Teil eines anderen' -Tags 'gefunden wird).

"atag btag" ist ein ungerade Wert für das Klassenattribut, aber versuchen Sie es trotzdem:

//*[starts-with(@class,"atag")]



Die Antwort von mjv ist ein guter Anfang, wird aber fehlschlagen, wenn atag nicht der erste aufgelistete Klassenname ist.

Der übliche Ansatz ist der etwas unhandliche:

//*[contains(concat(' ', @class, ' '), ' atag ')]

Dies funktioniert, solange Klassen nur durch Leerzeichen und nicht durch andere Leerzeichen getrennt sind. Dies ist fast immer der Fall. Wenn es nicht sein könnte, müssen Sie es noch unhandlicher machen:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

(Die Auswahl nach zeichenraumähnlichen zeichenfolgengetrennten Zeichenfolgen ist ein solcher häufiger Fall, dass es überraschend ist, dass es keine spezifische XPath-Funktion dafür gibt, wie CSS3s '[class ~ = "atag"].)




Um die Antwort von bobince hinzuzufügen ... Wenn das von Ihnen verwendete Werkzeug / die Bibliothek Xpath 2.0 verwendet, können Sie Folgendes tun:

//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]

count () wird anscheinend benötigt, da index-of () eine Sequenz jedes Indexes zurückgibt, für den in der Zeichenkette eine Übereinstimmung gefunden wurde.




Beachten Sie, dass die Antwort von Bobince möglicherweise zu kompliziert ist, wenn Sie davon ausgehen können, dass der von Ihnen gewünschte Klassenname keine Teilzeichenfolge eines anderen möglichen Klassennamens ist . Wenn dies der Fall ist, können Sie den Teilstring-Matching einfach über die contains-Funktion durchführen. Folgendes wird mit jedem Element übereinstimmen, dessen Klasse die Teilzeichenfolge 'atag' enthält:

//*[contains(@class,'atag')]

Wenn die obige Annahme nicht zutrifft, wird eine Teilstring-Übereinstimmung mit Elementen übereinstimmen, die Sie nicht beabsichtigen. In diesem Fall müssen Sie die Wortgrenzen finden. Durch die Verwendung der Leerzeichentrennzeichen, um die Klassennamengrenzen zu finden, findet Bobinces zweite Antwort die genauen Übereinstimmungen:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

Dies entspricht atag und nicht matag .




Sie können Folgendes versuchen

By.CssSelector("div.atag.btag")




Dadurch werden sie alle unabhängig von der Position der Attribute ausgewählt

//div[contains(@class, 'atag') and contains(@class ,'btag')]



[contains(text(),'')] nur wahr oder falsch zurück. Es werden keine Elementergebnisse zurückgegeben.





xpath