Nella mia pagina web, c'è un div
con un class
nome Test
.
Come posso trovarlo con XPath
?
Nella mia pagina web, c'è un div
con un class
nome Test
.
Come posso trovarlo con XPath
?
Risposte:
Questo selettore dovrebbe funzionare ma sarà più efficiente se lo sostituisci con il markup adatto:
//*[contains(@class, 'Test')]
Oppure, poiché sappiamo che l'elemento ricercato è un div
:
//div[contains(@class, 'Test')]
Ma poiché questo corrisponderà anche a casi come class="Testvalue"
o class="newTest"
, la versione di @ Tomalak fornita nei commenti è migliore :
//div[contains(concat(' ', @class, ' '), ' Test ')]
Se desideri essere davvero certo che corrisponderà correttamente, puoi anche utilizzare la funzione normalize-space per ripulire i caratteri di spazio bianco attorno al nome della classe (come indicato da @Terry):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
Si noti che in tutte queste versioni, il * dovrebbe essere sostituito con qualsiasi nome di elemento che si desidera effettivamente abbinare, a meno che non si desideri cercare tutti gli elementi nel documento per la condizione data.
//div[contains(concat(' ', @class, ' '), ' Test ')]
: anche i tuoi genereranno partite parziali.
Il modo più semplice ..
//div[@class="Test"]
Supponendo di voler trovare <div class="Test">
come descritto.
//
solo /
.
L' UNICO modo giusto per farlo con XPath:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
La funzione normalize-space
rimuove gli spazi bianchi iniziali e finali e sostituisce anche le sequenze di caratteri degli spazi bianchi con un singolo spazio.
Se non hai bisogno di molte di queste query Xpath, potresti voler utilizzare una libreria che converte i selettori CSS in XPath, poiché i selettori CSS sono in genere molto più facili da leggere e scrivere rispetto alle query XPath. Ad esempio, in questo caso, è possibile utilizzare entrambi div[class~="Test"]
e div.Test
per ottenere lo stesso risultato.
Alcune librerie sono stato in grado di trovare:
Sto solo fornendo questo come una risposta, come Tomalak ha fornito come commento alla risposta del mediatore molto tempo fa
//div[contains(concat(' ', @class, ' '), ' Test ')]
concat(' ', normalize-space(@class), ' ')
di tenere conto anche di tutti i tipi di spazi bianchi?
//div[contains(concat(' ', @class, ' '), ' Test ')]/chid
non selezionare i bambini?
Una funzione utile può essere ricavata dalle risposte precedenti:
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
Quindi concatena la chiamata di funzione nella tua query.
puoi trovare elementi come questo esempio (tutti gli elementi CSS)
private By
allElementsCss = By.xpath(".//div[@class]");