Partie 6: Utiliser des tuples, et la classe By de Marionette

 

Jusqu'à présent dans notre code, nous avons utilisé de nombreux repères pour trouver des éléments spécifiques, que ce soit des applications (iFrames) ou des parties d'applications. De plus, nous avons écrit les repères directement dans le code et en conséquence, dupliqué du code. Pour améliorer la situation par la suite, une bonne pratique est d'abstraire ces repères dans des variables tuples Python pour ensuite les réutiliser. Dans cet article, nous allons vous montrer comment faire.

Les tuples et la classe By de Marionette

Considérons comme exemple le repère que nous avons utilisé pour localiser le iFrame de l'application Contacts :

'css selector', "iframe[data-url*='contacts']"

Nous utilisons ce repère à la fois quand on attend l'affichage du cadre et quand on passe à l'intérieur de ce dernier. Pour rendre les choses plus simples, on peut stocker ceci dans une variable (il faut aussi iomporter By) :

from marionette import By

_contacts_frame_locator = (By.CSS_SELECTOR, "iframe[data-url*='contacts']")

La classe By de Marionette fournit un court-circuit pour accéder aux techiques de repérage comme id, le sélecteur CSS... Comme précédemment, on saisit l'élément en utilisant le sélecteur et ensuite on le stocke dans une variable tuple CSS. Si l'HTML (et le repère) change, alors il est plus facile de simplement mettre à jour la variable une fois, plutôt que de réaliser les changements aux deux endroits. Pour utiliser ce tuple, il faut l'inclure dans la méthode find_element() comme suit :

self.marionette.find_element(*self._contacts_frame_locator)

Note : * — dans ce contexte — est du code Python pour dépiler la liste d'arguments ; cela sépare le tuple d'origine en deux arguments que nous devons passer dans find_element(). Pour plus d'informations et d'exemples, lire Unpacking argument lists dans la documentation Python.

Un autre exemple de tuple, qui repère via l'attribut id :

_add_contact_button_locator = (By.ID, 'add-contact-button')

Utilisation de tuples et By dans notre test Contacts

Maintenant il est temps de réduire la duplication dans notre cas de test test_add_contact.py en déplaçant les repères hors du test vers le périmètre de la classe TestContacts où ils peuvent être partagés. Nous allons vous montrer comment substituer un couple de repères et laisser le reste comme exercice pour le lecteur.

D'abord vous devez vous assurer d'importer By, en mettant la ligne suivante au début de votre code :

from marionette import By

Maintenant nous pouvons ajouter nos tuples en haut de la classe TestContacts ; ajoutez les lignes suivantes juste en dessous de la ligne class TestContacts(unittest.TestCase) :

_contacts_frame_locator = (By.CSS_SELECTOR, "iframe[data-url*='contacts']")
_save_button_locator = (By.ID, "save-button")

Désormais, vous pouvez parcourir votre code et remplacer toutes les instances de

find_element('id', 'save-button')

par

find_element(*self._save_button_locator)

et toutes les instances de

find_element('css selector', "iframe[data-url*='contacts']")

avec

find_element(*self._contacts_frame_locator)

Et c'est tout pour le moment. Nous sommes sûrs que vous allez déjà voir les bénéfices de cette réutilisation de code, même dans cet exemple simple. La technique commence à devenir particulièrement efficace dès que vous commencez à écrire des tests plus complexes qui peuvent utiliser le même repère 5, 10 ou 20 fois.

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : jwhitlock, SphinxKnight, Goofy, J.DMB
 Dernière mise à jour par : jwhitlock,