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)





.
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.
.
.
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!