Bonjour à tous,

J'utilise le xpath (1.0) afin de rechercher des éléments dans une page HTML (Pour l'automatisation d'une appli sous Selenium, mais peu importe)
Voici un exemple pour mieux comprendre la suite

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<html>
   <label for="xxx">Mon label xxx</label> <input type="text" id="xxx" placeholder="Value for xxx"><br>
   <label for="yyy">Mon label yyy</label> <input type="text" id="yyy" placeholder="Value for yyy"><br>
   <label for="zzz">Mon label zzz</label> <input type="text" id="zzz" placeholder="Value for zzz"><br>
   <label for="test">Mon label test</label> <input type="text" id="test" placeholder="Value for test"><br>
   <label for="pppppp">Mon label autre</label> <input type="text" id="pppppp" placeholder="Value for autre"><br>
</form>
Mon but est de pouvoir retrouver l'input dont l'id correspond au for du label recherché
Par exemple si je cherche Mon label test, dont l'attribut for fait référence à test je dois pouvoir retrouver l'input <input type="text" id="test" placeholder="Value for test">
Forcément là c'est simple il est juste après...
Mais dans la fabuleuse appli sur laquelle je travaille, ils peuvent être à des niveaux complètement différents, ce qui est abjecte j'entends bien

Du coup voici mes différents tests

Retrouver le for... facile !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
//*[text()='Mon label test']/@for
Sa valeur, pas de soucis non plus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
string(//*[text()='Mon label test']/@for)
De l'autre côté, retrouver un input text par son id...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
//input[@id='test']
//input[@id=string('test')]
De là je me suis dit, et bien plus qu'à mixer les 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
//input[@id=string(//*[text()='Mon label test']/@for)]
Et bien... non
Après diverses recherches, j'ai essayé d'imbriquer la recherche afin de le forcer à exécuter la recherche sur le label avant, par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
//input[@id[starts-with(.,string(//*[text()='Mon label test']/@for))]]
Mais là encore il se fiche complètement du label et me ramène tous les inputs de la page
Voilà hummm quoi d'autre... non c'est tout

Auriez-vous quelques idées à me soumettre ?

Merci d'avance pour votre aide