2013-05-20 2 views
0

Je travaille sur l'automatisation d'un site Web et j'essaie de trouver un moyen de réduire l'utilisation de xpaths dans mon code. Mon code ressemble à ceciComment éliminer les xpaths dans le code Webdriver?

driver.findElement(By.xpath("//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[3]/td/input")).click(); 
    driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td")).getText(); 
    driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/div[2]/div/div/div[4]/div/div/div")).click(); 
    driver.findElement(By.xpath("//html/body/div[3]/div/div/div/div[2]/div/span/ul[2]/li[6]/a")).click(); 
    /*driver.findElement(By.xpath("//html/body/div/div/div/div[3]/div/div[2]/div[2]/table/tbody/tr/td[3]/table/tbody/tr/td[2]/em/button")).click(); 
    WebElement editUserForm = driver.findElement(By.cssSelector("iframe[src*='editUserForm']")); 

Est-il possible que je peux réduire ces XPath afin que mes codes ne semblent pas en mauvais état? Un des membres m'a suggéré "S'il vous plait, n'utilisez pas xpath absolu". Qu'est-ce que ça veut dire ? S'il vous plaît aider. Aussi laissez-moi savoir s'il y a un lien qui m'aidera à ce sujet.

Est-il possible de créer un fichier qui fera une chaîne de pointeur xpath, puis nous pouvons simplement utiliser la chaîne dans le code?

+2

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. –

Répondre

11

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 uploadDetailsou 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é?

+0

D'accord. @mac: Je vous recommande de vous familiariser avec les différentes manières d'utiliser xpaths (certaines plus fiables que d'autres), par exemple avec le tutoriel [w3c xpath] (http://www.w3schools.com/xpath/). –

+0

Merci à tous, C'est très utile pour un débutant comme moi. Je vais aller tout cela et peut-être alors va reprendre le travail. – mac

0

Ici encore Y XPath Y ne pas aller avec CSS

= .uploadDetails css> .docSpan - .doc

= .uploadDetails css> .excelSpan - .xls

= css .uploadDetails> .txtSpan - txt

simple

Questions connexes