2009-11-03 4 views
2

Je suis en train de tester une page web en utilisant du sélénium. Je veux obtenir tous les «éléments et éléments de feuille qui contiennent du texte». J'utilise le XPath de travail suivant.Descendent Relations + Indexation dans Selenium

//*[. != '' or not(*)] 

Cela fonctionne très bien. Mais maintenant je veux faire une boucle sur chacun de ces éléments et exécuter une commande dessus. Je veux réellement obtenir leur position, mais j'illustre mon problème en utilisant GetXpathCount.

int elementCount = this.selenium.GetXpathCount("//*[. != '' or not(*)]"); 
for (int i = 1; i <= elementCount; ++i) 
{ 
    Console.WriteLine(this.selenium.GetXpathCount("//*[. != '' or not(*)][" + i + "]")); 
} 

La valeur de elementCount est 242. Et la sortie de la console est 142 45 30 13 4 4 1 1 1 1 0 0 0 0 0 0 ... [200] d'autres zéros Les nombres sur la console toujours somme à elementCount, mais sont toujours à zéro après ~ 10.

Il est devenu évident pour moi que mon XPath

//*[. != '' or not(*)][1] 

N'a pas mon sens voulu. Et retourne à la place « tous les éléments de la feuille et tous les éléments contenant du texte qui sont le premier enfant de leur parent » et équivaut à

//*[(. != '' or not(*)) and position() = 1] 

Donc, j'utiliser des crochets pour corriger cette erreur:

(//*[(. != '' or not(*))])[1] 

Yay . La sortie de la console est maintenant 1 1 1 1 1 1 1 1 1 1 1 1 1 1 pour tous les éléments. Mais mettons à jour mon code de bouclage pour réellement effectuer une opération sur l'élément @ chemin.

int elementCount = this.selenium.GetXpathCount("//*[. != '' or not(*)]"); 
for (int i = 1; i <= elementCount; ++i) 
{ 
    Console.WriteLine(this.selenium.GetElementPositionLeft("(//*[. != '' or not(*)])[" + i + "]")); 
} 

NO !!! GetXpathCount fonctionne mais GetElementPositionLeft (et autres) échouent tous. Ce qui donne? Comment puis-je contourner cela?

est ici l'exception Sélénium: : [Selenium.SeleniumException] { "erreur Element [1] non trouvé (// [= '' ou non ().!])"}: { "ERREUR: Element (// [= '' ou non ().!]) [1] not found "} données: {} System.Collections.ListDictionaryInternal HelpLink: null InnerException: null message:" eRREUR: Element (// [.! = '' Ou non ()]) [1] introuvable " Source:" ThoughtWorks.Selenium.Core "

Répondre

4

Selenium ne sait pas quelle stratégie d'emplacement utiliser pour (//*[. != '' or not(*)])[1]. Essayez-le précédent avec xpath=

En tant que localisateur de remplacement, je suis arrivé que cela fonctionne avec les éléments suivants (en Java):

int elementCount = selenium.getXpathCount("/descendant::*[. != '' or not(*)]").intValue(); 
for (int i = 1; i <= elementCount; ++i) { 
    System.out.println(i + ": " + selenium.getElementPositionLeft("xpath=/descendant::*[. != '' or not(*)][" + i + "]")); 
} 
+0

erreur N00b. Le sélénium suppose qu'il s'agit d'un xpath lorsque les caractères de départ sont //. La fonction GetXpathCount suppose également que tous les identifiants sont xpaths. Mon erreur a été que l'ajout des parenthèses autour du xpath (chemin de //) a cassé le sélénium et maintenant je dois ajouter le xpath =. Merci – Kenn