Jak mogę znaleźć element za pomocą klasy CSS z XPath?

Na mojej stronie jest div z class o nazwie Test.

Jak mogę go znaleźć z XPath?

Author: John Slegers, 2009-10-22

6 answers

Ten selektor powinien działać, ale będzie bardziej wydajny, jeśli zastąpisz go odpowiednim znacznikiem:

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

Lub, ponieważ wiemy, że szukanym elementem jest div:

//div[contains(@class, 'Test')]

Ale ponieważ to również pasuje 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 normalize-space, aby wyczyścić bezpańskie białe znaki wokół nazwa klasy (jak wspomniano przez @ Terry):

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

Zauważ, że we wszystkich tych wersjach, * powinno być najlepiej zastąpione dowolną nazwą elementu, którą chcesz dopasować, chyba że chcesz przeszukać każdy element w dokumencie pod kątem podanego warunku.

 338
Author: meder omuraliev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 11:46:55

Najprostszy sposób..

//div[@class="Test"]

Zakładając, że chcesz znaleźć <div class="Test"> zgodnie z opisem.

 103
Author: Olli Puljula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-14 14:51:06

Podaję to jako odpowiedź, Tak jak Tomalak podał jako komentarz do odpowiedzi medera dawno temu

//div[contains(concat(' ', @class, ' '), ' Test ')]
 23
Author: Alex Lyman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 00:10:11

The ONLY right way to do it with XPath :

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

Funkcja normalize-space usuwa początkowe i końcowe białe znaki, a także zastępuje sekwencje białych znaków pojedynczym spacją.


Uwaga

Jeśli nie potrzebujesz wielu z tych zapytań Xpath, możesz użyć biblioteki, która konwertuje selektory CSS do XPath, ponieważ selektory CSS są zwykle dużo łatwiejsze zarówno do odczytu, jak i zapisu niż zapytania XPath. Na przykład, w tym przypadku, można użyć zarówno div[class~="foo"] i div.foo aby uzyskać ten sam wynik.

Niektóre biblioteki, które udało mi się znaleźć:

 15
Author: John Slegers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 23:55:39

Pomocna funkcja może być wykonana z poprzednich odpowiedzi:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

Następnie wystarczy połączyć wywołanie funkcji z zapytaniem.

 0
Author: Carcigenicate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 17:25:51

Możesz znaleźć elementy takie jak ten przykład (wszystkie elementy css)

private By 
allElementsCss = By.xpath(".//div[@class]");
 -4
Author: Sergei Zhilinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 15:10:26