Na mojej stronie znajduje div
się class
nazwa Test
.
Jak mogę to znaleźć XPath
?
Na mojej stronie znajduje div
się class
nazwa Test
.
Jak mogę to znaleźć XPath
?
Odpowiedzi:
Ten selektor powinien działać, ale będzie bardziej wydajny, jeśli zastąpisz go odpowiednim znacznikiem:
//*[contains(@class, 'Test')]
Lub, ponieważ wiemy, że poszukiwany element to div
:
//div[contains(@class, 'Test')]
Ale ponieważ będzie to również pasować do przypadków takich jak class="Testvalue"
lub class="newTest"
, wersja @ Tomalak podana w komentarzach jest lepsza :
//div[contains(concat(' ', @class, ' '), ' Test ')]
Jeśli chcesz być naprawdę pewien, że będzie pasował poprawnie, możesz również użyć funkcji normalizacji spacji, aby usunąć zbłąkane białe znaki wokół nazwy klasy (jak wspomniano w @Terry):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
Zauważ, że we wszystkich tych wersjach * należy najlepiej zastąpić dowolną nazwą elementu, który chcesz dopasować, chyba że chcesz wyszukać każdy element w dokumencie pod kątem danego warunku.
//div[contains(concat(' ', @class, ' '), ' Test ')]
- Twoi pojawią się również częściowe mecze.
Najłatwiejszy sposób ..
//div[@class="Test"]
Zakładając, że chcesz znaleźć <div class="Test">
zgodnie z opisem.
//
nie tylko /
.
Tylko właściwy sposób to zrobić z XPath:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
Funkcja normalize-space
usuwa wiodące i końcowe białe znaki, a także zastępuje ciąg znaków białych znaków pojedynczą spacją.
Jeśli nie potrzebujesz wielu z tych zapytań Xpath, możesz użyć biblioteki, która konwertuje selektory CSS na XPath, ponieważ selektory CSS są zwykle o wiele łatwiejsze zarówno do odczytu, jak i zapisu niż zapytania XPath. Na przykład w tym przypadku można użyć obu div[class~="Test"]
i div.Test
uzyskać ten sam wynik.
Niektóre biblioteki, które udało mi się znaleźć:
Podaję to tylko jako odpowiedź, jak dawno temu Tomalak jako komentarz do odpowiedzi medera
//div[contains(concat(' ', @class, ' '), ' Test ')]
concat(' ', normalize-space(@class), ' ')
na wszystkie rodzaje białych znaków?
//div[contains(concat(' ', @class, ' '), ' Test ')]/chid
nie wybiera dzieci?
Pomocną funkcję można uzyskać z poprzednich odpowiedzi:
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
Następnie po prostu połącz wywołanie funkcji z zapytaniem.
możesz znaleźć elementy takie jak ten przykład (wszystkie elementy css)
private By
allElementsCss = By.xpath(".//div[@class]");