2010-11-15 25 views
4

Je suis nouveau sur Selenium, nouveau ici et mon anglais n'est pas le meilleur.Selenium obtenir ID dynamique XPath

J'utilise le sélénium avec .NET ...

J'ai une page HTML comme cela, mais le nombre des événements sont différents:

<div id="eventContent" style="text-align: center;"> 
     <div class="event" id="event-8971062"> 
      <ul> 
       <li ...></li> 
       <li ...></li> 
       <li ...></li> 
      </ul> 
     </div>      
     <div class="event odd" id="event-9224880"> 
      <ul> 
       <li ...></li> 
       <li ...></li> 
       <li ...></li> 
      </ul> 
     </div>   
</div> 

Je dois vérifier toutes les données dans la divs différents mais le nombre est dynamique et l'identifiant (event) est dynamique aussi. J'essaie de trouver le nombre de divs au début mais ça ne marche pas. Pour cela, j'essaie ceci:

DefaultSelenium selenium = new DefaultSelenium(...); 
decimal count = selenium.GetXpathCount("//div[@id='eventContent']"); 

mais cela n'apporte que 1 résultat et pas deux pour cet exemple.

lorsque je tente:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]")); 

il imprime tous les divs, mais quand je fais:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]/div")); 

il imprime seulement la première div et je ne comprends pas pourquoi. Quelqu'un pourrait-il être si gentil et me donner une explication de ce qui se passe ici et où je me trompe?

Merci à l'avance Elur

Répondre

6
decimal count = selenium.GetXpathCount("//div[@id='eventContent']"); 

Cela renverra le nombre de div s qui ont une id de eventContent - il n'y a qu'un seul div comme celui-ci, ce qui est la raison pour laquelle vous obtenez un total de 1 (nombre les variables sont typiquement int s plutôt que decimal s, incidemment).

Si vous voulez que le compte du contenudiv s, utilisez

int count = selenium.GetXpathCount("//div[@id='eventContent']/div"); 

Ce comptera le nombre de divenfants du div avec un id de eventContent. Cela devrait retourner 2, comme vous le souhaitez.

En ce qui concerne vos GetText exemples, je pense que GetText ne retournera le texte du premier noeud que l'argument de XPath sélectionne. Donc, avec

selenium.GetText("//div[@id='eventContent'][1]") 

vous obtenez le texte intégral de la parentdiv, qui contient naturellement tous les enfants div s, mais avec

selenium.GetText("//div[@id='eventContent'][1]/div") 

vous obtenez le texte que le premier enfant div. Ce xpath sélectionne tous les enfants div, mais GetText fonctionne sur un seul élément, je crois.Si vous voulez examiner le texte de chaque enfant div à son tour, vous devez d'abord obtenir un compte de l'enfant div s, puis utilisez la boucle for pour obtenir chacun à son tour:

for(int i = 1; i <= count; ++i) 
{ 
    string childXpath = "//div[@id='eventContent']/div[" + i + "]"; 
    string eventText = selenium.GetText(childXpath); 

    // Processing of eventText 
} 

Une boucle for et le traitement manuel de xpath est nécessaire ici (plutôt que le plus propre foreach), car je crois que Selenium n'a pas un moyen de prendre un xpath et de retourner une collection d'éléments.

+0

+1 pour une bonne réponse. –

0

tryed cela, mais revient avec 0. Je résolu cela avec un temps d'expression où je vérifie avec isElementPresent comme ceci:

int a = 1; 
while (selenium.IsElementPresent("//div[@id='eventContent'][1]/div[" + a + "]")) 
{ 
    // check data here 
    a++; 
} 

semble fonctionner ainsi. merci beaucoup pour votre aide, meilleures salutations elur

+0

J'oublie toujours que les index xpath sont basés sur 1 et non sur 0. Edited mon exemple qui devrait maintenant faire la même chose que votre boucle while. – AakashM