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.