2009-09-23 8 views
3

Je suis en train de sélectionner un élément donné par:Selenium RC Ayant des problèmes avec XPath pour une table

/html/body[@id='someid']/form[@id='formid']/div[@id='someid2']/div[@id='']/div[@id='']/div[@id='']/table/tbody[@id='tableid']/tr[7]/td[2] 

Maintenant, le code html de cette ligne, je suis en train de sélectionner ressemble à ceci:

<tr> 
<td class="someClass">some text</td> 
<td class="someClass2">my required text for verifying</td> 
</tr> 

J'ai besoin de vérifier si mon texte requis pour vérifier existe dans la page.

  1. J'utilisé selenium.isTextPresent("my required text for verifying"); et cela ne fonctionne pas

  2. Alors maintenant, j'ai essayé avec selenium.isElementPresent("//td[contains(text(),'my required text for verifying')]")
    Cela fonctionne parfois, mais donne des défaillances aléatoires occassionally.

  3. essayées avec selenium.isElementPresent(//*[contains(text(),'my required text for verifying')]) trop ..

Comment puis-je vérifier ce texte sur la page en utilisant le sélénium?

Le problème n'est pas lié au temps de chargement de la page. J'ai pris des captures d'écran avant que l'échec se produise et a constaté que la page était entièrement chargée de sorte que ce ne devrait pas être le problème.

Quelqu'un pourrait suggérer un moyen de sélectionner cet élément ou n'importe quel moyen de valider ce texte sur l'écran?

Répondre

4

Essayez le localiser par CSS:

assertText(selenium.getText("css=.someClass2"), "my required text for verifying"); 

Le devrait donner au-dessus d'un meilleur message d'échec que isElementPresent, mais vous pouvez toujours utiliser que avec CSS localisateurs:

assertTrue(selenium.isElementPresent("css=.someClass2")); 

S'il y a un problème avec les temps de chargement, vous pouvez essayer d'attendre la présence de l'élément:

selenium.waitForCondition("var value = selenium.isElementPresent('css=.someClass2'); value == true", "60000"); 

localisateurs de chemin qui pourraient travailler pour vous, si vous préférez ne pas utiliser localisateurs CSS:

  • // td [contient (@class, 'someClass2')
  • XPath = id ('tableid')/tr [ 7]/td [2]
  • XPath = id ('tableid')/descendant :: td [contient (@class, 'someClass2')] [7]
+0

C'est une grande aide, Dave! Cela fonctionne enfin maintenant! – Mugen

1

Je n'ai jamais entendu parler du sélénium; mais votre XPath initial est inutilement fragile et verbeux.

Si un élément a un ID, il est unique; l'utilisation d'un tel XPath juste pour sélectionner un élément particulier est inutile; il suffit de sélectionner l'élément dernier avec l'ID. En outre, je vois que vous sélectionnez occasionnellement xyz[@id=''] - si vous essayez de sélectionner les éléments sans les attributs id, vous pouvez faire `xyz [not (@id)] à la place.

Si l'on suppose votre XPath initiale est fondamentalement correcte, il suffirait de faire quelque chose comme ceci:

//tbody[@id='tableid']/tr[7]/td[2] 

Cependant, en utilisant un certain nombre de lignes et de colonnes comme ça demande des ennuis si des changements jamais de toute façon les détails de la html En outre, il est atypique d'avoir des ID sur tbody éléments, peut-être l'élément table a l'ID? Enfin, vous pouvez rencontrer des problèmes de normalisation de l'espace. En XML, plusieurs espaces consécutifs sont souvent considérés comme équivalents à un seul espace, et vous ne tenez pas compte de cela. En particulier, si le xhtml est joliment imprimé et contient un saut de ligne au milieu de votre texte recherché, cela ne fonctionnera pas.

//td[contains(normalize-space(text()),'my required text for verifying')] 

Enfin, text() explicitement coché la case nœuds texte enfant - de sorte que le XPath ci-dessus ne choisirons pas des éléments où le texte n'est pas l'enfant immédiat de td (par exemple <td><b>my required text for verifying</b></td>) ne correspondront pas.Peut-être vous dire regarder le vale texte concaténée de tous les descendants:

//td[contains(normalize-space(string(.)),'my required text for verifying')] 

Enfin, la conversion de type peut être implicite dans XPath, donc string(.) peut être remplacé par . dans ce qui précède, ce qui conduit à la version:

//td[contains(normalize-space(.),'my required text for verifying')] 

Cela peut être lent sur les documents volumineux car il doit normaliser les espaces et effectuer une recherche de chaîne pour chaque élément td. Si vous rencontrez des problèmes de perf, essayez d'être plus précis sur les éléments td qui doivent être inspectés ou, si vous ne vous souciez pas du texte, essayez de réduire le nombre d '"appels" à normaliser l'espace en normalisant le doc complet en une fois (par exemple via /*[contains(normalize-space(.),'my required text for verifying')]).

+0

il ne l'utilise que XPath, il est juste pour illustrer le code HTML utilisé. –

+1

Alors pourquoi le marquer avec "xpath" ?? –

+0

Merci d'avoir répondu, mais je n'ai pas les problèmes de normalisation de l'espace. – Mugen

Questions connexes