Vous devez investir dans la page des objets, il est un modèle très utile:
https://code.google.com/p/selenium/wiki/PageObjects
Il aidera à faire le test à partir de la mise en œuvre. Par ce que je veux dire, le test devrait être laissé détaillant quelles mesures sont prises, l'implémentation (l'objet 'page') devrait détailler comment ces mesures sont prises.
En ce qui concerne les XPath eux-mêmes, oui, ils sont assez mauvais & peu fiable. Je suppose que vous les avez générés automatiquement pour vous par un outil, peut-être l'IDE ou Firebug. Jetez-les maintenant, ne les utilisez plus et lisez quelques tutoriels XPath - même la spécification XPath est un excellent lieu d'apprentissage.
Tout d'abord, supprimez le bit //html/body
, ce qui n'est pas nécessaire et le rend plus sombre. Cela fonctionnera bien sans cela. Deuxièmement, oui, avoir des XPath absolus (c'est-à-dire, ceux qui sont basés sur la position) sont mauvais. Dans votre première XPath:
//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[3]/td/input
Voir cette finale tr[3]
? Que faire si je devais coller une autre ligne (tr
) avant celle-ci? Cela signifie que votre XPath devrait être:
//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[4]/td/input
Cela signifie que le test va se casser. Cependant, le test ne se casse pas parce que la fonctionnalité testée est cassée, elle est cassée car l'implémentation du test est cassée. Vos tests ne devraient pas être aussi floconneux. Si un développeur veut coller un tr
au-dessus de celui que vous voulez, bien, à moins qu'il ne casse la chose réelle que vous testez, alors votre test devrait encore passer.
Vous devriez penser différemment. Pensez à d'autres façons d'arriver à cet élément. Disons que j'ai ceci:
<div id="divUpload">
<span class="uploadDetails">We only support the following files:
<span class="docSpan">.doc</span>
<span class="txtSpan">.txt</span>
</span>
<button type="submit">Upload the file<submit>
<div>
Je veux obtenir la durée avec docSpan
comme son nom de classe.
que je pouvais soit:
//div/span/span[1]
qui fonctionnerait, mais si elle a changé à:
<div id="divUpload">
<span class="uploadDetails">We only support the following files:
<span class="excelSpan">.xls</span>
<span class="docSpan">.doc</span>
<span class="txtSpan">.txt</span>
</span>
<button type="submit">Upload the file<submit>
<div>
Cela signifie que le bit [1]
n'est plus valide.
donc je pouvais:
//div/span[@class='uploadDetails']/span[text()='.doc']
Ce qui signifie, il va seulement à l'échec si la span
que je veux est retirée d'être un enfant de la durée d'une classe uploadDetails
ou la classe uploadDetails
est prise hors de la portée tout à fait.
Ou je pouvais:
//div/descendant::span[text()='.doc']
Cela signifie qu'il va seulement à l'échec si la durée est déplacé tout à fait, et n'est plus un enfant de cette div « parent ».
La ligne de fond ne dépend pas des positions. Pensez à ce qui se rapproche de cet élément. Y a-t-il quelque chose avec une classe? Y a-t-il quelque chose avec du texte à l'intérieur? Y a-t-il quelque chose avec une identification à proximité?
Sûrement certains de vos éléments ont un attribut id. Par exemple, si l'une de ces tables possède l'identifiant "factures", vous pouvez utiliser // table [@ id = 'factures'] 'pour couper tout ce qui précède l'axe de la table. Lire un tutoriel XPath, vous manquez toujours les bases de XPath et peut changer cela en une heure. Si vous voulez utiliser Selenium, restez sur XPath 1.0 en choisissant un tutoriel, les versions plus récentes ne sont pas supportées. –