No olviden instalar con pip install ddt amigos
0:00/13:35
No olviden instalar con pip install ddt amigos
Importante para esta clase tener instalada la libreria ddt, para los que usan anaconda es:
Para los que usan PIP es:
Haciendo hoy el ejercicio, encuentro que en la página para los ejercicios (demo-store.seleniumacademy) las cantidades han cambiado, ahora las cantidades del archivo testdata.csv deben ser las siguientes para que no falle la prueba:
CategoryOrProduct,NumberOfProducts earrings,1 music,5 denim,2 skirt,1 book,3
Puede que muchos lo sepan pero otros no, para que esta linea funcione sin ser modificada (@data(*get_data('testdata.csv'))) el archivo .csv debe estar en la misma carpeta donde esta el archivo .py y el archivo .csv debe llamarse "testdata" . Lo aclaro porque cuando se descarga el archivo este tiene otro nombre.
import csv, unittest
from ddt import ddt, data, unpack
from selenium import webdriver
def get_data(file_name):
rows = []
data_file= open(file_name, 'r')
reader= csv.reader(data_file)
next(reader, None)
for row in reader:
rows.append(row)
return rows
@ddt
class SearchDDT(unittest.TestCase):
def setUp(self):
self.driver= webdriver.Chrome(executable_path= "/home/yanina/Downloads/chromedriver")
driver= self.driver
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://demo-store.seleniumacademy.com')
@data(*get_data('testdata.csv'))
@unpack
def test_search_ddt(self, search_value, expected_count):
driver= self.driver
search_field= driver.find_element_by_name('q')
search_field.clear()
search_field.send_keys(search_value)
search_field.submit()
products = driver.find_elements_by_xpath('//h2[@class= "product-name"]/a')
expected_count= int(expected_count)
if expected_count>0:
self.assertEqual(expected_count, len(products))
else:
message= driver.find_elements_by_class_name('note-msg')
self.assertEqual('Your search returns no results.', message)
print(f'Found {len(products)} products')
if __name__== '__main__':
unittest.main(verbosity=2)```
Chicos estaba bueno manejar el acceso a los archivos con el keyword “with” ejemplo en la función get_dat()
Es una buena practica para que cuando abrimos el archivo para leerlo al terminar se cierre.
def get_data(file_name):
rows = []
with open(file_name, 'r') as data_file:
reader = csv.reader(data_file)
next(reader, None)
for row in reader:
rows.append(row)
return rows
Reading and Writing Files : https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
visual estudio code no me detectaba 'ddt' a pesar que lo instale con pip, encontre que la manera de instalarlo 'correctamente', para mi, es asi:
python -m pip install ddt
por supuesto en el ambiente virtual que cree para el curso.
Ojala le ayude algun@.
Hola, Tengo una pregunta en la linea 24 en donde esta el decorator @data usted usa un asterisco antes del function call. me podria explicar para que sirve? puedo asumir que es para hacer multiples llamadas de la funcion, pero no le entiendo bien. O me podria pasar la documentacion sobre como usarlo de esa forma?
He visto que le han dicho muchos halagos a lo largo del curso, profesor. Aquí está el mío. Hace un mes, tal vez un poco más, tomé el curso de Python de Google en Coursera, y ni ahí se aventaron algo tan complejo o tan didáctico como lo hizo usted en esta clase con el manejo de csv. Muy bien, la verdad me agradó bastante.
No se si es por la forma en la que Héctor explica o qué, pero realmente realizar DDT me ha parecido mucho más sencillo con Python.
Yo he tenido la oportunidad de hacer este tipo de ejercucio en una empresa para automatizar pruebas de una aplicación móvil usando Appium/Selenium y Java con TestNG y se me hacía un poco más engorroso por las librerías que había que importar y demás configuraciones.
Realmente pensaré seriamente cuando sea el momento de evaluar un framework de automatización basado en Python.
Royer Guerrero Pinilla
No olviden instalar con pip install ddt amigos
Cristian David Restrepo Marin
R0Y3R muchas gracias por el aporte!
Miguel Andres Rendon Reyes
Gracias bro, enserio que me iluminaste.
Alberto Perdomo
Importante para esta clase tener instalada la libreria ddt, para los que usan anaconda es:
Para los que usan PIP es:
Jorge Heli Rueda Uribe
Haciendo hoy el ejercicio, encuentro que en la página para los ejercicios (demo-store.seleniumacademy) las cantidades han cambiado, ahora las cantidades del archivo testdata.csv deben ser las siguientes para que no falle la prueba:
CategoryOrProduct,NumberOfProducts earrings,1 music,5 denim,2 skirt,1 book,3
Juan Agustin Di Pasquo
Muchas gracias Jorge 😄
polygonus polygonus
Puede que muchos lo sepan pero otros no, para que esta linea funcione sin ser modificada (@data(*get_data('testdata.csv'))) el archivo .csv debe estar en la misma carpeta donde esta el archivo .py y el archivo .csv debe llamarse "testdata" . Lo aclaro porque cuando se descarga el archivo este tiene otro nombre.
fidel angel ochoa
GRACIAS. este tipo de aclaraciones para los novatos nos sirve mucho
Usuario anónimo
UserFredy Mendoza Vargas
Muchas gracias
softdynamic sac
Es find_element_by_class_name, no find_elements_by_class_name
David Daniel Acerbo
Chicos estaba bueno manejar el acceso a los archivos con el keyword “with” ejemplo en la función get_dat()
Es una buena practica para que cuando abrimos el archivo para leerlo al terminar se cierre.
def get_data(file_name): rows = [] with open(file_name, 'r') as data_file: reader = csv.reader(data_file) next(reader, None) for row in reader: rows.append(row) return rows
Reading and Writing Files : https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
fidel angel ochoa
visual estudio code no me detectaba 'ddt' a pesar que lo instale con pip, encontre que la manera de instalarlo 'correctamente', para mi, es asi:
python -m pip install ddt
por supuesto en el ambiente virtual que cree para el curso.
Ojala le ayude algun@.
Fabricio González Guasque
Encontré la misma forma de hacerlo en google. Funciona 👍
Fernando Lambraño Leon
pip install ddt
Juan Manuel Trujillo Tarelo
Hola, Tengo una pregunta en la linea 24 en donde esta el decorator @data usted usa un asterisco antes del function call. me podria explicar para que sirve? puedo asumir que es para hacer multiples llamadas de la funcion, pero no le entiendo bien. O me podria pasar la documentacion sobre como usarlo de esa forma?
Miguel Angel Reyes Moreno
Antonio Manilla Maldonado
He visto que le han dicho muchos halagos a lo largo del curso, profesor. Aquí está el mío. Hace un mes, tal vez un poco más, tomé el curso de Python de Google en Coursera, y ni ahí se aventaron algo tan complejo o tan didáctico como lo hizo usted en esta clase con el manejo de csv. Muy bien, la verdad me agradó bastante.
Sergio Andrés Martínez Ramírez
No se si es por la forma en la que Héctor explica o qué, pero realmente realizar DDT me ha parecido mucho más sencillo con Python.
Yo he tenido la oportunidad de hacer este tipo de ejercucio en una empresa para automatizar pruebas de una aplicación móvil usando Appium/Selenium y Java con TestNG y se me hacía un poco más engorroso por las librerías que había que importar y demás configuraciones.
Realmente pensaré seriamente cuando sea el momento de evaluar un framework de automatización basado en Python.
Miquel Muntaner Barceló
La cantidad de resultados de la web han cambiado, por tanto, el CSV ahora está mal, aquí les dejo el correcto: (la búsqueda de earrings provocaba un error extraño, por eso lo he quitado, no sé si solo me sucede a mí)
CategoryOrProduct,NumberOfProducts music,5 denim,2 skirt,1 book,3
Andrés Mauricio Cárdenas Alvarado
Así es y para el primer ejercicio son en el decorador @data(('dress',5),('music',5))
Jeyson David Vargas Crespo
Hola, no acabo de entender lo de los decoradores, en este caso que son o para que sirven???
Alex Camacho
ProfesorEspero que este post te pueda aclarar tus dudas :)
Santiago Herrera Velásquez
los decoradores acceden a métodos propios de la metodología que resumidamente acá corren la prueba que esta abajo la cantidad de veces que sea necesario para usar todas las tuplas
Wilson Gustavo Chango Sailema
Jesús Velázquez Jiménez
Luis Adolfo Ramírez Inciarte
En un entorno de producción y con datos importantes, nunca dejen un archivo abierto. Usen mejor with open(file_name) as f: para evitar olvidar cerrarlo. Por qué? porque ésto se puede aprovechar para que cualquier usuario en el sistema consiga acceso a los datos del archivo hasta que se reinicie el OS
Enrique Uzcategui
Con 'dress' ahora salen 5 resultados en lugar de 6
Carlos Alberto Gutierrez Ramirez
Hola,
alguien sabe por que me sale este error: cannot import name 'ddt' from partially initialized module 'ddt' (most likely due to a circular import)
ya instale el ddt, con el comando pip install ddt
Jose Antonio Rojas Ollarves
Instala ddt:
pip install ddt```
Jose Antonio Rojas Ollarves
Antonio Demarco Bonino
Esta clase me costó mucho pero salio. Consejo: tengan la biblioteca ddt en la misma carpeta del archivo que de Python que están trabajando.
Miguel Angel Reyes Moreno
CategoryOrProduct,NumberOfProducts earrings,1 music,5 denim,2 skirt,1 book,3
fidel angel ochoa
justo me di cuenta que habia un cambio en la pagina de prueba, gracias.
import csv, unittest from ddt import ddt, data, unpack from selenium import webdriver def get_data(file_name): rows = [] data_file= open(file_name, 'r') reader= csv.reader(data_file) next(reader, None) for row in reader: rows.append(row) return rows @ddt class SearchDDT(unittest.TestCase): def setUp(self): self.driver= webdriver.Chrome(executable_path= "/home/yanina/Downloads/chromedriver") driver= self.driver driver.implicitly_wait(10) driver.maximize_window() driver.get('http://demo-store.seleniumacademy.com') @data(*get_data('testdata.csv')) @unpack def test_search_ddt(self, search_value, expected_count): driver= self.driver search_field= driver.find_element_by_name('q') search_field.clear() search_field.send_keys(search_value) search_field.submit() products = driver.find_elements_by_xpath('//h2[@class= "product-name"]/a') expected_count= int(expected_count) if expected_count>0: self.assertEqual(expected_count, len(products)) else: message= driver.find_elements_by_class_name('note-msg') self.assertEqual('Your search returns no results.', message) print(f'Found {len(products)} products') if __name__== '__main__': unittest.main(verbosity=2)```
import csv, unittest from ddt import ddt, data, unpack from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By def get_data(file_name): rows = [] data_file= open(file_name, 'r') reader= csv.reader(data_file) next(reader, None) for row in reader: rows.append(row) return rows @ddt class SearchDDT(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver= self.driver driver.implicitly_wait(10) driver.maximize_window() driver.get('Link URL') @data(*get_data('testdata.csv')) @unpack def test_search_ddt(self, search_value, expected_count): driver= self.driver search_field= driver.find_element(By.NAME,'q') search_field.clear() search_field.send_keys(search_value) search_field.submit() products = driver.find_elements(By.XPATH,'//h2[@class= "product-name"]/a') expected_count= int(expected_count) if expected_count>0: self.assertEqual(expected_count, len(products)) else: message= driver.find_elements(By.CLASS_NAME,'note-msg') self.assertEqual('Your search returns no results.', message) print(f'Found {len(products)} products') if __name__== '__main__': unittest.main(verbosity=2)
Wow! Esta clase fue muy interesante.
import csv, unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from ddt import ddt, data, unpack def get_data(file): rows = [] # list for input data_file = open(file,'r') # variable define file in read mode reader = csv.reader(data_file) # variable select library for read file next(reader, None) for i in reader: rows.append(i) return rows @ddt class DataDrivenTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(service=Service('./chromedriver')) driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("https://demo-store.seleniumacademy.com/") @data(*get_data("externaldata.csv")) # call our function get_data @unpack def test_search_ddt(self, search_value, expected_count): driver = self.driver search_field = driver.find_element(By.NAME, 'q') search_field.clear() search_field.send_keys(search_value) search_field.submit() products = driver.find_elements(By.XPATH, '//h2[@class="product-name"]/a') expected_count = int(expected_count) if expected_count > 0: self.assertEqual(expected_count, len(products)) else: msg = self.driver.find_element(By.CLASS_NAME,'note-msg') self.assertEqual('Your search returns no results.', msg) print(f'Find {len(products)} products') def tearDown(self): self.driver.implicitly_wait(3) self.driver.close() if __name__ == '__main__': unittest.main(verbosity = 2)
Saludos amigos aqui les comparto la primera parte del codigo utilizando firefox.
import unittest from selenium import webdriver #Importar libreria ddt y extraer submodulos from ddt import ddt, data, unpack #Permitira utilizar los datos y desempaquetarlos #Colocar decorado @ddt class SearchDDT(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox(executable_path= r'./geckodriver.exe') driver = self.driver driver.implicitly_wait(5) driver.maximize_window() driver.get('https://demo-store.seleniumacademy.com/') @data(('dress', 6),('music', 5)) #Decorador que almacena los elementos a buscar @unpack #Decorador para desempaquetar las tuplas y poder ingresar a ellass de forma individual #Agregaremos dos parametros al metodo uno para buscar y otro para validar def test_search_ddt(self, search_value, expected_count): driver = self.driver #Ubicar campo de busqueda search_field = driver.find_element_by_name('q') search_field.clear()#Limpiar en caso de que tengan algun texto #Ingresamos el valor a buscar search_field.send_keys(search_value) #Boton de busqueda search_button = driver.find_element_by_class_name('button') search_button.click() #Identificar donde estan los productos products = driver.find_elements_by_xpath('//h2[@class="product-name"]/a') #Verficiar que todo haya salido bien con un print statement print(f"Found {len(products)} products") #Ciclo for para imprimir los elementos de la pagina actual for i in products: print(i.text) #Assertion de validacion self.assertEqual(expected_count, len(products)) def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()```