CursosEmpresasBlogLiveConfPrecios

Preparar assertions y test suites

Clase 8 de 24 • Curso de Introducción a Selenium con Python

Clase anteriorSiguiente clase

Contenido del curso

Conocer el ecosistema de Selenium

  • 1
    Por qué aprender Selenium y qué verás

    Por qué aprender Selenium y qué verás

    03:15 min
  • 2
    Historia de Selenium

    Historia de Selenium

    09:05 min
  • 3
    Otras herramientas de testing y automatización

    Otras herramientas de testing y automatización

    03:40 min

Preparar entorno de trabajo

  • 4
    Configurar entorno de trabajo

    Configurar entorno de trabajo

    01:43 min
  • 5

    Compatibilidad con Python 3.9 y aprendiendo a utilizar múltiples versiones

    01:44 min
  • 6
    ¡Hola, mundo!

    ¡Hola, mundo!

    11:51 min

Utilizar comandos básicos

  • 7
    Encontrar elementos con find_element

    Encontrar elementos con find_element

    15:23 min
  • 8
    Preparar assertions y test suites

    Preparar assertions y test suites

    Viendo ahora
  • 9

    Entender las clases WebDriver y WebElement

    01:18 min

Interactuar con elementos

  • 10
    Manejar form, textbox, checkbox y radio button

    Manejar form, textbox, checkbox y radio button

    13:37 min
  • 11
    Manejar dropdown y listas

    Manejar dropdown y listas

    07:42 min
  • 12
    Manejar alert y pop-up

    Manejar alert y pop-up

    06:05 min
  • 13
    Automatizar navegación

    Automatizar navegación

    03:54 min

Sincronizar pruebas

  • 14
    Demora implícita y explícita

    Demora implícita y explícita

    08:38 min
  • 15

    Condicionales esperadas

    00:44 min

Retos

  • 16
    Agregar y eliminar elementos

    Agregar y eliminar elementos

    09:16 min
  • 17
    Elementos dinámicos

    Elementos dinámicos

    06:46 min
  • 18
    Controles dinámicos

    Controles dinámicos

    08:01 min
  • 19
    Typos

    Typos

    05:43 min
  • 20
    Ordenar tablas

    Ordenar tablas

    07:12 min

Metodologías de Trabajo

  • 21
    Data Driven Testing (DDT)

    Data Driven Testing (DDT)

    13:35 min
  • 22
    Page Object Model (POM)

    Page Object Model (POM)

    10:35 min

Cierre del curso

  • 23
    Realizar una prueba técnica

    Realizar una prueba técnica

    11:33 min
  • 24
    Conclusiones

    Conclusiones

    01:43 min
  • Tomar el examen del curso
    • Korpi delfin

      Korpi delfin

      student•
      hace 5 años

      Les comparto el código ya con documentación.

      Assertions

      import unittest from selenium import webdriver #sirve como excepción para los assertions cuando queremos #validar la presencia de un elemento from selenium.common.exceptions import NoSuchElementException #ayuda a llamar a las excepciones que queremos validar from selenium.webdriver.common.by import By class AssertionsTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'.\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo.onestepcheckout.com/") def test_search_field(self): self.assertTrue(self.is_element_present(By.NAME, 'q')) def test_language_option(self): self.assertTrue(self.is_element_present(By.ID, 'select-language')) def tearDown(self): self.driver.quit() #para saber si está presente el elemento #how: tipo de selector #what: el valor que tiene def is_element_present(self, how, what): try: #busca los elementos según el parámetro self.driver.find_element(by = how, value = what) except NoSuchElementException as variable: return False return True

      Search tests

      import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver class SearchTests(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'.\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo.onestepcheckout.com") def test_search_tee(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.clear() #limpia el campo de búsqueda en caso de que haya algún texto. search_field.send_keys('tee') #simulamos la escritura del teclado para poner "tee" search_field.submit() #envía los datos ('tee') para que la página muestre los resultados de "tee" def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.send_keys('salt shaker') #escribimos 'salt shaker' en la barra de búsqueda search_field.submit() #envíamos la petición #hago una lista de los resultados buscando los elementos por su Xpath. Es la forma más rápida. products = driver.find_elements_by_xpath('//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a') #vamos a preguntar si la cantidad de resultados es igual a 1 self.assertEqual(1, len(products)) def tearDown(self): self.driver.quit()

      Smoke tests

      from unittest import TestLoader, TestSuite from pyunitreport import HTMLTestRunner #para generar el reporte from assertions import AssertionsTest from search_tests_assertions import SearchTests assertions_test = TestLoader().loadTestsFromTestCase(AssertionsTest) search_tests = TestLoader().loadTestsFromTestCase(SearchTests) #contruimos la suite de pruebas smoke_test = TestSuite([assertions_test, search_tests]) #para generar los reporters kwargs = { "output": 'smoke-report' } #la variable runner almacena un reporte generado por HTMLTestRuner #usa como argumento "kwarsp" runner = HTMLTestRunner(**kwargs) #corro el rurner con la suite de prueba runner.run(smoke_test)
        Andrés Corral

        Andrés Corral

        student•
        hace 5 años

        gracias

        Gabriel Martin Estrada

        Gabriel Martin Estrada

        student•
        hace 5 años

        Muchas gracias!!!!

      Facundo Soto

      Facundo Soto

      student•
      hace 4 años

      No me gusta ser el negativo pero este curso me parece desastroso, está lleno de cosas no explicadas o implícitas o también cosas esenciales explicadas de manera vaga

        Mario Alberto Treviño

        Mario Alberto Treviño

        student•
        hace 4 años

        Justo entre a los comentarios para ver si era impresión mía o si esta muy mal explicado.

        Fredy Alexander Izquierdo Dominguez

        Fredy Alexander Izquierdo Dominguez

        student•
        hace 4 años

        Pienso igual.

      Andrés Xavier Vargas Vera

      Andrés Xavier Vargas Vera

      student•
      hace 5 años

      Al parecer el código que muestra el profesor no guarda los reportes de los test cases, cuando se evalúan en un Suite, porque solo guarda el reporte del último Test Case....

      Yo logré solucionarlo, al parecer hay que instalar otra librería, la librería que nos hace instalar el profesor al parecer es un fork de esta otra librería que tiene muchas mas funcionalidades y está actualizada constantemente.

      Screenshot 2021-06-09 164748.png

      pip install html-testRunner

      https://github.com/oldani/HtmlTestRunner

      Esta otra librería se importa: ANTES:

      from pyunitreport import HTMLTestRunner

      AHORA:

      from HtmlTestRunner import HTMLTestRunner

      y cuando se prueba Test Cases es igual que antes, no mas que ahora guarda los archivos con un mobre raro, si alguien logra descubrir como evitar esto, estaría agradecido:

      Screenshot 2021-06-09 170330.png

      Un pequeño cambio, en output, para guardar en carpetas destro de reports, se agrega esto:

      Screenshot 2021-06-09 165300.png

      El add_timestamps es para agregar la fecha y hora al nombre del archivo, no me gustó, por eso le pongo FALSE, pero si desean le pueden dejar TRUE

      En cuanto para Suites, resuelve el problema que están teniendo: Lo unico que cambia son los kwargs y los imports dados anteriormente

      kwargs = { "output": "reports/smoke-report", "report_name": "smoke-report", "combine_reports": True, "add_timestamp": False } # ? create runner with the parameters and run runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)

      En este caso el nombre del archivo si se guarda con el nombre que se le da

      Screenshot 2021-06-09 170127.png

      Y ahora se crea un solo reporte para todos los test cases en el suite

      Screenshot 2021-06-09 170215.png

        Tomas Jesus Escobar Cueltan

        Tomas Jesus Escobar Cueltan

        student•
        hace 4 años

        Muchas gracias amigo por tomarte el tiempo de explicar esta parte, muy importante saberlo.

        Jesús Enrique Morocoima Marcano

        Jesús Enrique Morocoima Marcano

        student•
        hace 4 años

        Super

      Pablo Rivera Sepúlveda

      Pablo Rivera Sepúlveda

      student•
      hace 3 años

      El tema de automatizacion es increible... lastima la explicacion de este curso, que desastre!!!

        Manuel Rodrigo Zamorano Jimenez

        Manuel Rodrigo Zamorano Jimenez

        student•
        hace 3 años

        Así es ..!

        Julian Crispin

        Julian Crispin

        student•
        hace 3 años

        Este curso es de los peores, enredado, dificil de seguir, una pesadilla

      Carlos Andres Ocampo Pabon

      Carlos Andres Ocampo Pabon

      student•
      hace 5 años

      Para los que no entendimos el porqué se el doble asterisco cuando se está pasando el **kwargs al HTMLTestRunner, aquí dejo un articulo donde explican:

      Explicación **kwargs

        Cesar Sosa

        Cesar Sosa

        student•
        hace 5 años

        Heroe, gracias! ya entendí mejor el código de esta clase.

      David Rodriguez

      David Rodriguez

      student•
      hace 5 años

      Excelente Clase Héctor, Esto es súper útil para no hacer múltiples ejecuciones. Interesante que al no agregar el campo report_name se guarda con el dia y hora de la ejecución.

      David Diaz

      David Diaz

      student•
      hace 3 años

      Buenas noches, compañeros! Si en algún momento alguien llegase a tener problema con:

      • Solo me genera un reporte con 2 tests cuando fueron 4
      • Si el elemento no existe me tira errores raros

      Les traigo la solución a ambos.

      Assertions

      import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager class AssertionsTest(unittest.TestCase): @classmethod def setUp(self): self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("Platzi decía que el sitio no era seguro.com") def test_search_field(self): print('Searching the search bar') self.assertTrue(self.is_element_present(By.NAME, 'q')) def test_language_option(self): print('Searching the Select language dropdown') self.assertTrue(self.is_element_present(By.ID, 'iselect-language')) @classmethod def tearDown(self): self.driver.quit() def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException(): self.driver.close() return False return True

      (Ojo, lo deje como "iselect-language" para que vean que ejecuta el código completa aún cuando algún elemento no exista)

      Search Test

      import unittest from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager class SearchTests(unittest.TestCase): @classmethod def setUp(self): self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("Platzi no dejo poner el URL :c") def test_search_tee(self): driver = self.driver search_field = driver.find_element(By.NAME, "q") search_field.clear() search_field.clear() search_field.send_keys('tee') search_field.submit() def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element(By.NAME, "q") search_field.clear() search_field.send_keys('salt shaker') search_field.submit() #Searching by XPATH -> $x('//div[@class = "product-info"]/h2[@class="product-name"]/a/text()').map(x => x.wholeText) or $x('//div[@class = "product-info"]/h2/a/text()').map(x => x.wholeText) # REMEMBER: "h2" could also be replaced by "text-fill" products = driver.find_elements(By.XPATH, '//div[@class = "product-info"]/h2[@class="product-name"]/a') self.assertEqual(1, len(products)) @classmethod def tearDown(self): self.driver.quit()

      Finalmente... Smoke Tests

      from unittest import TestLoader, TestSuite from assertions import AssertionsTest from searchtests import SearchTests from HtmlTestRunner import HTMLTestRunner assertions_test = TestLoader().loadTestsFromTestCase(AssertionsTest) search_tests = TestLoader().loadTestsFromTestCase(SearchTests) #contruimos la suite de pruebas smoke_test = TestSuite([assertions_test, search_tests]) # Aquí generamos nuestros reportes kwargs = { "output": "reports/smoke-report", "report_name": "smoke-report", "combine_reports": True, "add_timestamp": True } runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)

      Como pueden notar, la sección importante es la sección de "kwargs", aquí usamos "combine_reports": True para que los 4 reportes puedan estar juntos. Espero esto les ayude y así evitan horas de busquedas para solucionar esos problemas.

      Gracias por sus atenciones y HAPPY CODING!

        Jose Leonardo Araya Parajeles

        Jose Leonardo Araya Parajeles

        student•
        hace 3 años

        como lograste hacer funcionar el: from HtmlTestRunner import HTMLTestRunner he buscado pero no logro instalarlo

        Eduardo Pérez

        Eduardo Pérez

        student•
        hace 3 años

        Hola Jose, que error te esta saliendo?

      Julio César Zaravia Paredes

      Julio César Zaravia Paredes

      student•
      hace 5 años

      ¡Hola Comunidad! . En un video anterior dejé una respuesta con una explicación sobre este error 👇👇👇 .

      chromium_error-2.jpg
      . Ya que quizá este error le esté apareciendo a algunos de ustedes (como a mí) aprovecho en dejarlo por aquí como un aporte: . Según pude revisar (porque a mi también me pasó 😔) este error se debe a que el Driver intenta generar una nueva sesión del navegador Chrome y para esto hace una serie de validaciones, una de las validaciones tiene que ver con ++la interfaz webUSB (que permite el acceso a dispositivos USB desde una página web)++, es en este punto en que se genera el error. . ++¿Por qué se genera el error?++ ¿Por qué se genera el error? Parece que no tiene nada que ver con tus entradas USB 😅 sino que parece ser que es un error de Chromium, según he podido leer ya fue notificado para su revisión. . ++Y, ¿Qué hacemos?++ No lo sé 🤠 ... Pero he leído que el error no impide la generación de un nuevo contexto de navegación, es decir tu navegador debería abrirse y cargar la web y ejecutar los tests que hayas programado sin ser afectados. . En mi caso he notado que la ejecución a pesar de mostrar el error termina en status OK, he podido visualizar que el navegador se abre como de costumbre y me ha generado los reportes de manera satisfactoria, sin embargo estoy haciendo más pruebas mientras avanzo el curso. .
      error_webUSB.jpg
      . Pero no podría decirles más. Esperemos que puedan solucionar esto y sigamos haciendo pruebas para ver ++si en realidad afecta nuestro trabajo++ o no. . Trataré de actualizar este comentario si encuentro algo más, por lo pronto les dejo esta discusión en SO que me sirvió de mucho y de la que extraje algunos de los datos que acabo de comentar. . Si alguien lee esto y está más enterado que yo del asunto o ha visto que me he equivocado en algo, o en todo 😐, por favor lo comenta y así aprendemos todos. . ¡Saludos!

        Sergio Bryan Madrid Nuñez

        Sergio Bryan Madrid Nuñez

        student•
        hace 4 años

        Puedes utilizar el WebDriver de Firefox. https://pythonbasics.org/selenium-firefox/, aquí pueden encontrar un blog que explica como hacerlo. En lugar de instalar el webdriver de chrome, hay que utilizar algo similar llamado geckodriver que pueden descargar aquí: https://github.com/mozilla/geckodriver/releases, sólo dejan el archivo descomprimido en el mismo nivel en el que tengan su código o señalan la ruta del geckodriver como hacemos en el curso. Ahora seria: webdriver.Firefox()

        Sebastián Franco

        Sebastián Franco

        student•
        hace 4 años

        A mi tambien me daba el error de USB, pero era porque en la función test_lenguage_option() el assert de lenguaje tenía escrito "select-lenguage" en vez de "select-language", fue corregirlo y todo fluyó. Puede que a alguien más le sirva.

      Ricardo Moreno

      Ricardo Moreno

      student•
      hace 5 años

      *Actualización Para el día de hoy ya no aparece el item de Language por lo tanto es test falla en esa parte

      Saludos!

        Julian Ramirez Chacon

        Julian Ramirez Chacon

        student•
        hace 5 años

        A día de hoy select-language si sirve, la prueba pasa sin ningún problema

        Ricardo Moreno

        Ricardo Moreno

        student•
        hace 5 años

        Gracias por la info, al momento que realicé el curso no pasaba el test y era porque no estaba la opcion del lenguaje... supongo que no lo vi o algo cambio jaja.

        Saludos!

      Juan Francisco Pons

      Juan Francisco Pons

      student•
      hace 3 años

      Es un quilombo esta clase! Pésimo todo. Salta de la nada a otro archivo con el mismo nombre pero distinto contenido.

        Manuel Rodrigo Zamorano Jimenez

        Manuel Rodrigo Zamorano Jimenez

        student•
        hace 3 años

        Asi es ..

      Agustin Zamar

      Agustin Zamar

      student•
      hace 5 años

      Hola! Cuando se genera el reporte de la suite de tests smoketests solo muestra reportes de los tests del ultimo archivo ejecutado. ¿Hay alguna forma de que el reporte incluya a todos los tests? ¿O que se cree un archivo para cada uno?

        Gabriel Ichcanziho Pérez Landa

        Gabriel Ichcanziho Pérez Landa

        student•
        hace 5 años

        tengo exactamente el mismo problema :( y al parecer no soy el único

        Víctor Mazo

        Víctor Mazo

        student•
        hace 4 años

        La única forma que encontré fue ingresar cada test de forma separada en el TestSuite(), sin notación de lista, más creo que se pierde la ventaja de utilizar el test suite.

      Boris Saavedra

      Boris Saavedra

      student•
      hace 5 años

      El profe no lo mencionó, pero si corren el Test Suite y colocan el parámetro report_name los reportes (obviamente) se sobrescriben y solo verán un reporte. Es por eso que conviene no colocar este parámetro.

      De nada 🤣

        Alejandro Benjamín Like García

        Alejandro Benjamín Like García

        student•
        hace 5 años

        aunque no coloques el report_name se siguen sobrescribiendo. figuran con la misma hora y segundo

      Felipe Alexis Moreno Durán

      Felipe Alexis Moreno Durán

      student•
      hace 5 años

      Estimados el codigo a continuación:

      assertions.py

      import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By class AssertionsTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'C:\Python Scripts\curso_selenium\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo-store.seleniumacademy.com/") def test_search_field(self): self.assertTrue(self.is_element_present(By.NAME, 'q')) def test_language_option(self): self.assertTrue(self.is_element_present(By.ID, 'select-language')) def tearDown(self): self.driver.quit() def is_element_present(self, how, what): try: self.driver.find_element(by = how, value = what) except NoSuchElementException as variable: return False return True``` searchtests.py

      import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver

      class SearchTests(unittest.TestCase):

      def setUp(self): self.driver = webdriver.Chrome(executable_path = r'C:\Python Scripts\curso_selenium\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo-store.seleniumacademy.com/") def test_search_tee(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.clear() search_field.send_keys('tee') search_field.submit() def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.send_keys('salt shaker') search_field.submit() products = driver.find_elements_by_xpath('//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a') self.assertEqual(1, len(products)) def tearDown(self): self.driver.quit()```

      smoketests.py

      from unittest import TestLoader, TestSuite from pyunitreport import HTMLTestRunner from assertions import AssertionsTest from searchtests import SearchTests assertions_test = TestLoader().loadTestsFromTestCase(AssertionsTest) search_tests = TestLoader().loadTestsFromTestCase(SearchTests) #Construccion de suite de pruebas smoke_test = TestSuite([assertions_test, search_tests]) #Respecto a los reportes kwargs = { "output": 'smoke-report' } runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)``` Exito y saludos
      John Steven González

      John Steven González

      student•
      hace 4 años

      Cuando se utiliza el decorador @classmethod la prueba dura muchísimo menos, hablando en tiempo.

      Leslie Paz Ore

      Leslie Paz Ore

      student•
      hace 5 años

      Una consulta compañeros, aún no comprendo bien cuál es la funcionalidad de

      verbosity=2

      Podrían ayudarme, please?

        Miguel Andres Rendon Reyes

        Miguel Andres Rendon Reyes

        student•
        hace 4 años

        Hola Leslor, te explico brevemente, que la función del parámetro verbosity es para definir, qué tantas explicaciones queremos por parte de unittest. Es decir, qué tanto texto quieres que aparezca en medio de la prueba. Puedes probar poner 1 y verás cómo casi no te va a decir nada en la terminal. Es como si con verbosity, le pides que sea verbal, que explique más detalladamente.

        Leslie Paz Ore

        Leslie Paz Ore

        student•
        hace 4 años

        Muchas Gracias Umi! , Realize el cambio de verbosity a 1, pero me salen las mismas lineas que cuando le pongo 3 o 4, Supongo que mientras más complejo sea el Test Case, lograré ver la diferencia. Thanks! :)

      Jessica Martinez Freire

      Jessica Martinez Freire

      student•
      hace 5 años

      No se por que, pero el xpath aparentemente cambió y colocando (1, len (products)) no da, sale AssertionError: 1 != 0.

      Mi xpath sale: '//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[1]/div[4]/ul/li/div/h2/a'

      Y el xpath del video sale: '//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a'

      ¿Como me doy cuenta en este caso? porque la logica esta bien, pero copio el xpath de la pagina y no me da (hoy por hoy), pero si uso el xpath del video si me da.

      < def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.send_keys('salt shaker') search_field.submit() products = driver.find_elements_by_xpath('//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a') self.assertEqual(1, len(products))>
        Julian Ramirez Chacon

        Julian Ramirez Chacon

        student•
        hace 5 años

        Tienes mal la ruta XPATH , la ruta es:

        products = driver.find_elements_by_xpath('/html/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a')
        Angela Nipitella

        Angela Nipitella

        student•
        hace 5 años

        Me pasaba lo mismo. Resulta que cuando le daba a inspeccionar la pagina cambiaba de tamaño poder desplegar el menú de desarrolladores de chrome. Al copiar el xpath lo estaba haciendo en una vista adaptada para móviles. esto lleva a tu portapapeles un xpath diferente al de una vista para monitor de pc. Lo pude solucionar en el menú de opciones de la consola de desarrolladores de chrome para que al darle al botón de inspeccionar se abra esta consola en una ventana nueva, dejando intacto el tamaño original de la web.

      Miguel Rodriguez Perez

      Miguel Rodriguez Perez

      student•
      hace 3 años

      Este curso es maravilloso para el que tiene cierto nivel en python, si eres nuevo tomando el curso y no tienes experiencia resolviendo los problemas mas comunes al programar y buscar documentación probablemente se te complique un poco mas de lo habitual y creas que se tiene que estar explicando todo lo que escribe el profesor.

      Luis Jhonayquer Zapata Yamo

      Luis Jhonayquer Zapata Yamo

      student•
      hace 4 años

      Al parecer Selenium a la hora de ejecutar los test lo hace en función al orden alfabético según del nombre las funciones de los test.

      Karla Berenice

      Karla Berenice

      student•
      hace 5 años

      Hola, saben como se le puede hacer para que se genere un solo archivo de resultados con todos los casos de prueba de todas las clases, es que conmigo me genera uno, pero solo de la última clase ejecutada

        Agustin Zamar

        Agustin Zamar

        student•
        hace 5 años

        Hola! ¿Pudiste encontrar alguna solucion a esto?

        Andrés Xavier Vargas Vera

        Andrés Xavier Vargas Vera

        student•
        hace 5 años

        Yo logré solucionarlo al parecer hay que instalar otra librería, la librería que nos hace instalar el profesor al parecer es un fork de esta otra librería que tiene muchas mas funcionalidades y está actualizada constantemente.

        Screenshot 2021-06-09 164748.png

        pip install html-testRunner

        https://github.com/oldani/HtmlTestRunner

        Esta otra librería se importa: ANTES:

        from pyunitreport import HTMLTestRunner

        AHORA:

        from HtmlTestRunner import HTMLTestRunner

        y cuando se prueba Test Cases es igual que antes, no mas que ahora guarda los archivos con un mobre raro, si alguien logra descubrir como evitar esto, estaría agradecido:

        Screenshot 2021-06-09 170330.png

        Un pequeño cambio, en output, para guardar en carpetas destro de reports, se agrega esto:

        Screenshot 2021-06-09 165300.png

        El add_timestamps es para agregar la fecha y hora al nombre del archivo, no me gustó, por eso le pongo FALSE, pero si desean le pueden dejar TRUE

        En cuanto para Suites, resuelve el problema que están teniendo: Lo unico que cambia son los kwargs y los imports dados anteriormente

        kwargs = { "output": "reports/smoke-report", "report_name": "smoke-report", "combine_reports": True, "add_timestamp": False } # ? create runner with the parameters and run runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)

        En este caso el nombre del archivo si se guarda con el nombre que se le da

        Screenshot 2021-06-09 170127.png

        Y ahora se crea un solo reporte para todos los test cases en el suite

        Screenshot 2021-06-09 170215.png

      jesus alberto negrin guerrero

      jesus alberto negrin guerrero

      student•
      hace 5 años

      Excelente tema y profesor, de hecho justo un error que comento cuando buscamos el xpath que es poner (elements) plural valga la redundancia casi se me explotaba la cabeza porque lo buscaba en singular y me arrojaba un error lo lei como 3 veces hasta que me di cuenta por el siemple hecho de no prestar atencion XD

        Héctor Daniel Vega Quiñones

        Héctor Daniel Vega Quiñones

        teacher•
        hace 5 años

        Muchas gracias por el comentario, Jesús. En efecto hay que estar muy atentos cuando queremos identificar uno o varios elementos :eyes:

    Escuelas

    • Desarrollo Web
      • Fundamentos del Desarrollo Web Profesional
      • Diseño y Desarrollo Frontend
      • Desarrollo Frontend con JavaScript
      • Desarrollo Frontend con Vue.js
      • Desarrollo Frontend con Angular
      • Desarrollo Frontend con React.js
      • Desarrollo Backend con Node.js
      • Desarrollo Backend con Python
      • Desarrollo Backend con Java
      • Desarrollo Backend con PHP
      • Desarrollo Backend con Ruby
      • Bases de Datos para Web
      • Seguridad Web & API
      • Testing Automatizado y QA para Web
      • Arquitecturas Web Modernas y Escalabilidad
      • DevOps y Cloud para Desarrolladores Web
    • English Academy
      • Inglés Básico A1
      • Inglés Básico A2
      • Inglés Intermedio B1
      • Inglés Intermedio Alto B2
      • Inglés Avanzado C1
      • Inglés para Propósitos Específicos
      • Inglés de Negocios
    • Marketing Digital
      • Fundamentos de Marketing Digital
      • Marketing de Contenidos y Redacción Persuasiva
      • SEO y Posicionamiento Web
      • Social Media Marketing y Community Management
      • Publicidad Digital y Paid Media
      • Analítica Digital y Optimización (CRO)
      • Estrategia de Marketing y Growth
      • Marketing de Marca y Comunicación Estratégica
      • Marketing para E-commerce
      • Marketing B2B
      • Inteligencia Artificial Aplicada al Marketing
      • Automatización del Marketing
      • Marca Personal y Marketing Freelance
      • Ventas y Experiencia del Cliente
      • Creación de Contenido para Redes Sociales
    • Inteligencia Artificial y Data Science
      • Fundamentos de Data Science y AI
      • Análisis y Visualización de Datos
      • Machine Learning y Deep Learning
      • Data Engineer
      • Inteligencia Artificial para la Productividad
      • Desarrollo de Aplicaciones con IA
      • AI Software Engineer
    • Ciberseguridad
      • Fundamentos de Ciberseguridad
      • Hacking Ético y Pentesting (Red Team)
      • Análisis de Malware e Ingeniería Forense
      • Seguridad Defensiva y Cumplimiento (Blue Team)
      • Ciberseguridad Estratégica
    • Liderazgo y Habilidades Blandas
      • Fundamentos de Habilidades Profesionales
      • Liderazgo y Gestión de Equipos
      • Comunicación Avanzada y Oratoria
      • Negociación y Resolución de Conflictos
      • Inteligencia Emocional y Autogestión
      • Productividad y Herramientas Digitales
      • Gestión de Proyectos y Metodologías Ágiles
      • Desarrollo de Carrera y Marca Personal
      • Diversidad, Inclusión y Entorno Laboral Saludable
      • Filosofía y Estrategia para Líderes
    • Diseño de Producto y UX
      • Fundamentos de Diseño UX/UI
      • Investigación de Usuarios (UX Research)
      • Arquitectura de Información y Usabilidad
      • Diseño de Interfaces y Prototipado (UI Design)
      • Sistemas de Diseño y DesignOps
      • Redacción UX (UX Writing)
      • Creatividad e Innovación en Diseño
      • Diseño Accesible e Inclusivo
      • Diseño Asistido por Inteligencia Artificial
      • Gestión de Producto y Liderazgo en Diseño
      • Diseño de Interacciones Emergentes (VUI/VR)
      • Desarrollo Web para Diseñadores
      • Diseño y Prototipado No-Code
    • Contenido Audiovisual
      • Fundamentos de Producción Audiovisual
      • Producción de Video para Plataformas Digitales
      • Producción de Audio y Podcast
      • Fotografía y Diseño Gráfico para Contenido Digital
      • Motion Graphics y Animación
      • Contenido Interactivo y Realidad Aumentada
      • Estrategia, Marketing y Monetización de Contenidos
    • Desarrollo Móvil
      • Fundamentos de Desarrollo Móvil
      • Desarrollo Nativo Android con Kotlin
      • Desarrollo Nativo iOS con Swift
      • Desarrollo Multiplataforma con React Native
      • Desarrollo Multiplataforma con Flutter
      • Arquitectura y Patrones de Diseño Móvil
      • Integración de APIs y Persistencia Móvil
      • Testing y Despliegue en Móvil
      • Diseño UX/UI para Móviles
    • Diseño Gráfico y Arte Digital
      • Fundamentos del Diseño Gráfico y Digital
      • Diseño de Identidad Visual y Branding
      • Ilustración Digital y Arte Conceptual
      • Diseño Editorial y de Empaques
      • Motion Graphics y Animación 3D
      • Diseño Gráfico Asistido por Inteligencia Artificial
      • Creatividad e Innovación en Diseño
    • Programación
      • Fundamentos de Programación e Ingeniería de Software
      • Herramientas de IA para el trabajo
      • Matemáticas para Programación
      • Programación con Python
      • Programación con JavaScript
      • Programación con TypeScript
      • Programación Orientada a Objetos con Java
      • Desarrollo con C# y .NET
      • Programación con PHP
      • Programación con Go y Rust
      • Programación Móvil con Swift y Kotlin
      • Programación con C y C++
      • Administración Básica de Servidores Linux
    • Negocios
      • Fundamentos de Negocios y Emprendimiento
      • Estrategia y Crecimiento Empresarial
      • Finanzas Personales y Corporativas
      • Inversión en Mercados Financieros
      • Ventas, CRM y Experiencia del Cliente
      • Operaciones, Logística y E-commerce
      • Gestión de Proyectos y Metodologías Ágiles
      • Aspectos Legales y Cumplimiento
      • Habilidades Directivas y Crecimiento Profesional
      • Diversidad e Inclusión en el Entorno Laboral
      • Herramientas Digitales y Automatización para Negocios
    • Blockchain y Web3
      • Fundamentos de Blockchain y Web3
      • Desarrollo de Smart Contracts y dApps
      • Finanzas Descentralizadas (DeFi)
      • NFTs y Economía de Creadores
      • Seguridad Blockchain
      • Ecosistemas Blockchain Alternativos (No-EVM)
      • Producto, Marketing y Legal en Web3
    • Recursos Humanos
      • Fundamentos y Cultura Organizacional en RRHH
      • Atracción y Selección de Talento
      • Cultura y Employee Experience
      • Gestión y Desarrollo de Talento
      • Desarrollo y Evaluación de Liderazgo
      • Diversidad, Equidad e Inclusión
      • AI y Automatización en Recursos Humanos
      • Tecnología y Automatización en RRHH
    • Finanzas e Inversiones
      • Fundamentos de Finanzas Personales y Corporativas
      • Análisis y Valoración Financiera
      • Inversión y Mercados de Capitales
      • Finanzas Descentralizadas (DeFi) y Criptoactivos
      • Finanzas y Estrategia para Startups
      • Inteligencia Artificial Aplicada a Finanzas
      • Domina Excel
      • Financial Analyst
      • Conseguir trabajo en Finanzas e Inversiones
    • Startups
      • Fundamentos y Validación de Ideas
      • Estrategia de Negocio y Product-Market Fit
      • Desarrollo de Producto y Operaciones Lean
      • Finanzas, Legal y Fundraising
      • Marketing, Ventas y Growth para Startups
      • Cultura, Talento y Liderazgo
      • Finanzas y Operaciones en Ecommerce
      • Startups Web3 y Blockchain
      • Startups con Impacto Social
      • Expansión y Ecosistema Startup
    • Cloud Computing y DevOps
      • Fundamentos de Cloud y DevOps
      • Administración de Servidores Linux
      • Contenerización y Orquestación
      • Infraestructura como Código (IaC) y CI/CD
      • Amazon Web Services
      • Microsoft Azure
      • Serverless y Observabilidad
      • Certificaciones Cloud (Preparación)
      • Plataforma Cloud GCP

    Platzi y comunidad

    • Platzi Business
    • Live Classes
    • Lanzamientos
    • Executive Program
    • Trabaja con nosotros
    • Podcast

    Recursos

    • Manual de Marca

    Soporte

    • Preguntas Frecuentes
    • Contáctanos

    Legal

    • Términos y Condiciones
    • Privacidad
    • Tyc promociones
    Reconocimientos
    Reconocimientos
    Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
    Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
    Logo reconocimientoPrimera Startup EdTech · 2018
    Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
    Logo reconocimientoCEO Mejor Emprendedor del año · 2024
    De LATAM conpara el mundo
    YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads