test_sauce_demo_class.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. ##### IMPORT
  2. import pytest
  3. import logging as log
  4. import time
  5. from selenium import webdriver
  6. from selenium.webdriver.common.by import By
  7. from selenium.webdriver.common.keys import Keys
  8. from selenium.webdriver.support import expected_conditions as EC
  9. from selenium.common.exceptions import TimeoutException
  10. from selenium.webdriver.support.ui import WebDriverWait
  11. from selenium.webdriver.support.ui import Select
  12. from selenium.webdriver.firefox.options import Options
  13. from test_saucedemo import writeInInput
  14. import os
  15. # Commande pour run Pytest et générer un rapport de test HTML:
  16. # python -m pytest --html=rapporDeTest.html --self-contained-html --log-cli-level=INFO
  17. class TestSauceDemo:
  18. ##### METHODES PYTEST
  19. def setup_method(self, method):
  20. log.info("Methode de SETUP AVANT CHAQUE TEST")
  21. if self.is_windows():
  22. self.driver = webdriver.Firefox()
  23. else:
  24. options = webdriver.FirefoxOptions()
  25. options.add_argument("--headless")
  26. self.driver = webdriver.Firefox(options=options)
  27. self.driver.get("http://www.saucedemo.com")
  28. assert (
  29. self.driver.current_url == "https://www.saucedemo.com/"
  30. ), "Nous ne somme pas sur la bonne page"
  31. def teardown_method(self, method):
  32. log.info("Methode de TEARDOWN APRES CHAQUE TEST")
  33. self.driver.quit()
  34. ##### METHODES DIVERS
  35. def is_windows(self):
  36. # oups
  37. res = False
  38. if os.name == "nt":
  39. res == True
  40. return res
  41. def writeInInput(self, inputElement, text):
  42. assert inputElement.is_displayed(), "Le champ texte n'est pas affiché"
  43. assert inputElement.is_enabled(), "Le champ texte n'est pas activé"
  44. inputElement.clear()
  45. inputElement.send_keys(text)
  46. def login(self):
  47. username = self.driver.find_element(By.ID, "user-name")
  48. password = self.driver.find_element(By.ID, "password")
  49. login = self.driver.find_element(By.ID, "login-button")
  50. writeInInput(inputElement=username, text="standard_user")
  51. writeInInput(password, text="secret_sauce")
  52. login.click()
  53. def login_custum(self, user, pwd):
  54. username = self.driver.find_element(By.ID, "user-name")
  55. password = self.driver.find_element(By.ID, "password")
  56. login = self.driver.find_element(By.ID, "login-button")
  57. writeInInput(inputElement=username, text=user)
  58. writeInInput(password, text=pwd)
  59. login.click()
  60. def logout(self):
  61. burger = self.driver.find_element(By.ID, "react-burger-menu-btn")
  62. burger.click()
  63. logout = self.driver.find_element(By.ID, "logout_sidebar_link")
  64. logout.click()
  65. def add_item(self, item):
  66. self.driver.find_element(By.ID, f"add-to-cart-sauce-labs-{item}").click()
  67. return item
  68. def go_to_checkout(self):
  69. checkout = self.driver.find_element(By.CSS_SELECTOR, "#checkout")
  70. checkout.click()
  71. def fill_checkout(self,name1,name2,zip):
  72. first_name=self.driver.find_element(By.ID,"first-name")
  73. last_name=self.driver.find_element(By.ID,"last-name")
  74. zip_code=self.driver.find_element(By.ID,"postal-code")
  75. writeInInput(inputElement=first_name, text=name1)
  76. writeInInput(inputElement=last_name, text=name2)
  77. writeInInput(inputElement=zip_code, text=zip)
  78. ##### TEST ABBAS
  79. #@pytest.mark.skip("")
  80. def test_saucedemo_boutenbout(self):
  81. log.info("Test bout en bout login + log out")
  82. self.login()
  83. self.logout()
  84. ##### TEST MANEL
  85. #@pytest.mark.skip("")
  86. def test_login_bad_username(self):
  87. log.info("Test login avec mauvais username")
  88. self.login_custum("test", "secret_sauce")
  89. erreur_message = self.driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
  90. assert erreur_message.is_displayed(), "Pas de message d'erreur "
  91. assert (
  92. erreur_message.text
  93. == "Epic sadface: Username and password do not match any user in this service"
  94. ), "le message est erroné"
  95. #@pytest.mark.skip("")
  96. def test_login_bad_passwrd(self):
  97. log.info("Test login avec mauvais password")
  98. self.login_custum("standard_user", "test")
  99. erreur_message = self.driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
  100. assert erreur_message.is_displayed(), "Pas de message d'erreur "
  101. assert (
  102. erreur_message.text
  103. == "Epic sadface: Username and password do not match any user in this service"
  104. ), "le message est erroné"
  105. #@pytest.mark.skip("")
  106. def test_login_bad_username_and_bad_passwrd(self):
  107. log.info("Test login avec mauvais username et mauvais password")
  108. self.login_custum("test", "test")
  109. erreur_message = self.driver.find_element(By.CSS_SELECTOR,'[data-test=error]')
  110. assert erreur_message.is_displayed(), "Pas de message d\'erreur "
  111. assert erreur_message.text == "Epic sadface: Username and password do not match any user in this service", "le message est erroné"
  112. #@pytest.mark.skip("")
  113. def test_login_username_vide(self):
  114. log.info("Test login avec username vide et bon password")
  115. self.login_custum("", "secret_sauce")
  116. erreur_message = self.driver.find_element(By.CSS_SELECTOR,'#login_button_container > div > form > div.error-message-container.error > h3')
  117. assert erreur_message.is_displayed(), "Pas de message d\'erreur "
  118. assert erreur_message.text == "Epic sadface: Username is required", "le message est erroné"
  119. #@pytest.mark.skip("")
  120. def test_login_paswrd_vide(self):
  121. log.info("Test login avec bon username et bon password vide")
  122. self.login_custum("standard_user", "")
  123. erreur_message = self.driver.find_element(By.CSS_SELECTOR,'#login_button_container > div > form > div.error-message-container.error > h3')
  124. assert erreur_message.is_displayed(), "Pas de message d\'erreur "
  125. assert erreur_message.text == "Epic sadface: Password is required", "le message est erroné"
  126. #@pytest.mark.skip("")
  127. def test_login_username_and_pswerd_vide(self):
  128. log.info("Test login avec username et password vides")
  129. self.login_custum("", "")
  130. erreur_message = self.driver.find_element(By.CSS_SELECTOR,'#login_button_container > div > form > div.error-message-container.error')
  131. assert erreur_message.is_displayed(), "Pas de message d\'erreur "
  132. assert erreur_message.text == "Epic sadface: Username is required", "le message est erroné"
  133. ##### MATTHIEU
  134. # @pytest.mark.skip("")
  135. def test_affichage_Checkout(self):
  136. log.info("Test de la redirection sur la page de Checkout")
  137. # connexion Swag Labs
  138. self.login()
  139. # ajout "Sauce Labs Bike Light" au panier -- A changer si Tiff implémente une fonction pour le faire
  140. self.add_item("bike-light")
  141. # affichage panier -- A changer si Tiff implémente une fonction pour le faire
  142. panier_btn = self.driver.find_element(By.ID, "shopping_cart_container")
  143. panier_btn.click()
  144. # redirection vers la page de checkout
  145. self.go_to_checkout()
  146. assert (
  147. self.driver.current_url
  148. == "https://www.saucedemo.com/checkout-step-one.html"
  149. ), "Nous ne somme pas sur la bonne page"
  150. def test_Checkout_3_champs_vides(self):
  151. log.info("Test Checkout avec tous les champs vides")
  152. # connexion Swag Labs
  153. self.login()
  154. # ajout "Sauce Labs Bike Light" au panier -- A changer si Tiff implémente une fonction pour le faire
  155. self.add_item("bike-light")
  156. # affichage panier -- A changer si Tiff implémente une fonction pour le faire
  157. panier_btn = self.driver.find_element(By.ID, "shopping_cart_container")
  158. panier_btn.click()
  159. # redirection vers la page de checkout
  160. self.go_to_checkout()
  161. self.fill_checkout("","","")
  162. continue_btn = self.driver.find_element(By.ID, "continue")
  163. continue_btn.click()
  164. erreur_message = self.driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
  165. assert erreur_message.is_displayed(), "Pas de message d'erreur "
  166. assert (
  167. erreur_message.text
  168. == "Error: First Name is required"
  169. ), "le message est erroné"
  170. def test_Checkout_first_name_vide(self):
  171. log.info("Test Checkout avec le champ first name vide")
  172. # connexion Swag Labs
  173. self.login()
  174. # ajout "Sauce Labs Bike Light" au panier -- A changer si Tiff implémente une fonction pour le faire
  175. self.add_item("bike-light")
  176. # affichage panier -- A changer si Tiff implémente une fonction pour le faire
  177. panier_btn = self.driver.find_element(By.ID, "shopping_cart_container")
  178. panier_btn.click()
  179. # redirection vers la page de checkout
  180. self.go_to_checkout()
  181. self.fill_checkout("","Familly_name","999999")
  182. continue_btn = self.driver.find_element(By.ID, "continue")
  183. continue_btn.click()
  184. erreur_message = self.driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
  185. assert erreur_message.is_displayed(), "Pas de message d'erreur "
  186. assert (
  187. erreur_message.text
  188. == "Error: First Name is required"
  189. ), "le message est erroné"
  190. def test_Checkout_first_name_vide(self):
  191. log.info("Test Checkout avec le champ last name vide")
  192. # connexion Swag Labs
  193. self.login()
  194. # ajout "Sauce Labs Bike Light" au panier -- A changer si Tiff implémente une fonction pour le faire
  195. self.add_item("bike-light")
  196. # affichage panier -- A changer si Tiff implémente une fonction pour le faire
  197. panier_btn = self.driver.find_element(By.ID, "shopping_cart_container")
  198. panier_btn.click()
  199. # redirection vers la page de checkout
  200. self.go_to_checkout()
  201. self.fill_checkout("First","","999999")
  202. continue_btn = self.driver.find_element(By.ID, "continue")
  203. continue_btn.click()
  204. erreur_message = self.driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
  205. assert erreur_message.is_displayed(), "Pas de message d'erreur "
  206. assert (
  207. erreur_message.text
  208. == "Error: Last Name is required"
  209. ), "le message est erroné"
  210. def test_Checkout_first_name_vide(self):
  211. log.info("Test Checkout avec le champ zip code vide")
  212. # connexion Swag Labs
  213. self.login()
  214. # ajout "Sauce Labs Bike Light" au panier -- A changer si Tiff implémente une fonction pour le faire
  215. self.add_item("bike-light")
  216. # affichage panier -- A changer si Tiff implémente une fonction pour le faire
  217. panier_btn = self.driver.find_element(By.ID, "shopping_cart_container")
  218. panier_btn.click()
  219. # redirection vers la page de checkout
  220. self.go_to_checkout()
  221. self.fill_checkout("First","Familly_name","")
  222. continue_btn = self.driver.find_element(By.ID, "continue")
  223. continue_btn.click()
  224. erreur_message = self.driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
  225. assert erreur_message.is_displayed(), "Pas de message d'erreur "
  226. assert (
  227. erreur_message.text
  228. == "Error: Postal Code is required"
  229. ), "le message est erroné"
  230. def test_Checkout_ok(self):
  231. log.info("Test Checkout OK")
  232. # connexion Swag Labs
  233. self.login()
  234. # ajout "Sauce Labs Bike Light" au panier -- A changer si Tiff implémente une fonction pour le faire
  235. self.add_item("bike-light")
  236. # affichage panier -- A changer si Tiff implémente une fonction pour le faire
  237. panier_btn = self.driver.find_element(By.ID, "shopping_cart_container")
  238. panier_btn.click()
  239. # redirection vers la page de checkout
  240. self.go_to_checkout()
  241. self.fill_checkout("First","Familly_name","9999")
  242. continue_btn = self.driver.find_element(By.ID, "continue")
  243. continue_btn.click()
  244. assert (
  245. self.driver.current_url
  246. == "https://www.saucedemo.com/checkout-step-two.html"
  247. ), "Nous ne somme pas sur la bonne page"
  248. ##### TEST TIFF
  249. @pytest.mark.skip("")
  250. def test_add_item(self):
  251. self.login()
  252. backpack_item = "backpack"
  253. add_to_cart_button = self.driver.find_element(
  254. By.ID, f"add-to-cart-sauce-labs-{backpack_item}"
  255. )
  256. self.add_item(backpack_item)
  257. log.info(f"Le bouton : {add_to_cart_button} est cliqué")
  258. post_add_item_click = self.driver.find_element(
  259. By.ID, f"remove-sauce-labs-{backpack_item}"
  260. )
  261. assert (
  262. add_to_cart_button == post_add_item_click
  263. ), f"Le bouton {add_to_cart_button} ne correspond pas au résultat attendu qui est : {post_add_item_click}"
  264. log.info(
  265. f"Avant d'ajouter l'item le bouton proposé est : {add_to_cart_button} et le bouton est : {post_add_item_click} après ajout de l'item"
  266. )