Andres Felipe Henao
Julian Crispin
Parece interesante, lo voy a probar y te cuento
Andrés Corral
Me sirvio muchisimo lo de la API mil gracias!
Korpi delfin
Fredy Mendoza Vargas
Gracias por el detalle
karen gonzalez
gracias por esto! de verdad que ayuda muchisimo!
DIANA SOFIA AGUDELO MENDEZ
Esta clase me pareció muy útil y me resulto mas fácil de seguir que la anterior.
Cometí algunos errores, por ejemplo al auto-completar se me fue find_elements y al ejecutar me decía que las listas no contaban con esa opción. Fue bueno porque me sirvió para recordar lo que el profesor ha mencionado de que es distinto element de elements.
Diego Diego
me acaba de pasar lo mismo si no leo esto no me doy cuenta, jaja gracias :)
Julian Crispin
Tambien me paso igual y estaba desesperado, gracias por tu post
Carlos Andres Ocampo Pabon
Tengo una duda, ¿por qué a pesar de que se le pusiera la espera el programa siguió como si nada? digo parece que la espera no se hubiera realizado. O cómo es que funciona ese método?
Jorge Heli Rueda Uribe
Me pasa igual.
fidel angel ochoa
a mi igual
francisco ecatl melo valle
en lugar de usar
driver.explicitly_wait()
yo usé
time.sleep()
Ya que driver.explicitly_wait() no pausa el programa
Alejandro Orozco
Exacto, EXPLICITLY WAIT espera hasta que el elemento en la pagina este disponible, si le pones 5 seg pero esta disponible antes lo ejecuta. a diferencia del SLEEP que si espera 5 segundos con el programa pausado
Pero la ventaja que tiene explicitly wait es que espera hasta que encuentre el elemento, a diferencia del Sleep que pausa la ejecución del programa. sin embargo, si el internet no es bueno y se pasa del tiempo que le pones en Sleep, el programa arroja un error de no encontrar el elemento, a diferencia de explicitly wait que espera hasta que el elemento este disponible para ejecutar la acción( pongo un tiempo alto en explicitly wait para que lo encuentre, en sleep seria adicionar mucho tiempo por iteración).
yo personalmente pongo sleep entre cambios de test y pongo explicitly wait dentro de cada test que quiero realizar.
Gersom Gezzer García Sánchez
Me temo que el método implicitly_wait(time_to_wait) no hace pausas en la ejecución, sino que establece un timeout. En la documentación dice lo siguiente: Sets a sticky timeout to implicitly wait for an element to be found,
or a command to complete. This method only needs to be called one time per session. To set the timeout for calls to execute_async_script, see set_script_timeout.
Victor Martin Ortiz Palacio
Leslie Paz Ore
Wow, acabo de leer tu Código. Me parece genial lo de la implementación del diccionario, lo intentaré.
fidel angel ochoa
interesante, aunque no comprendo completamnete el codigo intuyo un poco el funcionameinto, estaria genial si lo explicaras "explicitamente".
Royer Guerrero Pinilla
Me gusto mucho la clase, esto ya es un poco más práctico en fines de testing
Héctor Daniel Vega Quiñones
ProfesorAsí es Elliot, aunque Selenium no esté netamente hecho para el testing puede ayudarte a hacer pruebas replicando acciones humanas :)
Mateo Dellacasa
No entiendo la razon por la cual estas clases tienen tan pocos aportes. Es un tema muy interesante para realizar el curso
Michael Forero Chaux
Uy esto es una maravilla!, voy a programar una rutina para que se diligencia la encuesta de salud por si misma, jajajaja
Bruno Marcelo Lara Sainz
esta clase me parece muy util y mejor explicada
CRISTIAN FELIPE ROA CANO
Hola a todos, quisiera decirles que el xpath es muy importante en el área del testing y que es una muy buena practica seguir métodos para la construcción de este, ya que si nos basamos unicamente en copiar el que brinda la página por defecto estamos expuestos a cambios y actualizaciones que nos dejan obsoletos nuestros xpath. Si quieren aprender algunas técnica les recomiendo https://www.guru99.com/xpath-selenium.html
:D
Kevin Echenique
Junior Peves
Hola les comparto mis anotaciones :D
Selenium Notion
estefany Liza
Jesús Enrique Morocoima Marcano
buena... gracias
Miguel Angel Reyes Moreno
Gabriel Oswaldo Giraldo Martínez
To respuesta me ayudó a que finalmente corriera la prueba correctamente en windows 10. Sin esas lineas de opciones no lo hubiera logrado
Sebastián Andrade
Hola, que son variables de enterno?
Enso Vergara Gutierrez
Hola creo que puedes referirte a variables de entorno que son variables a nivel de sistema operativo, esto permite que los programas que corren en tu SO puedan acceder a estas variables donde generalmente se guardan rutas de archivos y binarios. Saludos.
Sebastián Andrade
Si, me referia a entorno, muchas gracias :)
Juan Sebastian Avila
Hola.
Encontré una extensión para VSCode que nos puede facilitar la generación de datos aleatorios. Me pareció muy útil. Espero les pueda ser de ayuda.
Random Everything
Saludos
Hola a todos, Teniendo en cuenta que es importante que los datos de prueba sean datos "No Reales" quiero compartirles un generador de datos ficticios aleatorios llamado 'mockaroo' (https://www.mockaroo.com/) permite quenerar un esquema personalizado de datos y tambien permite crear una API muy facil de consumir para obtener dichos datos, por otro lado algo que hice tambien fue evitar los pasos de los click en la pagina de inicio yendo directamente al form de crear cuenta. Les comparto la API que pude generar y la forma como lo implementé
api_data_mock.py :
import requests import random class ApiDataMock: response = requests.get( 'https://my.api.mockaroo.com/create_account_form_selenium_seleniumacademy_platzi.json?key=cbb86130') data = response.json() i = random.randint(0, 99) first_name = data[i]['first_name'] middle_name = data[i]['middle_name'] last_name = data[i]['last_name'] email_address = data[i]['email_address'] password = data[i]['password']
register_new_user.py:
import unittest from selenium import webdriver from api_data_mock import ApiDataMock class RegisterNewUser(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path=r'D:\Selenium\Proyectos\Curso Selenium Platzi\chromedriver.exe') driver = self.driver driver.implicitly_wait(10) driver.maximize_window() driver.get('http://demo-store.seleniumacademy.com/customer/account/create/') def test_new_user(self): driver = self.driver self.assertEqual('Create New Customer Account', driver.title) first_name = driver.find_element_by_id('firstname') middle_name = driver.find_element_by_id('middlename') last_name = driver.find_element_by_id('lastname') email_address = driver.find_element_by_id('email_address') password = driver.find_element_by_id('password') confirm_password = driver.find_element_by_id('confirmation') news_letter_subscription = driver.find_element_by_id('is_subscribed') submit_button = driver.find_element_by_xpath('//*[@id="form-validate"]/div[2]/button/span/span') self.assertTrue(first_name.is_enabled() and middle_name.is_enabled() and last_name.is_enabled() and email_address.is_enabled() and password.is_enabled() and confirm_password.is_enabled() and news_letter_subscription.is_enabled() and submit_button.is_enabled()) first_name.send_keys(ApiDataMock.first_name) middle_name.send_keys(ApiDataMock.middle_name) last_name.send_keys(ApiDataMock.last_name) email_address.send_keys(ApiDataMock.email_address) password.send_keys(ApiDataMock.password) confirm_password.send_keys(ApiDataMock.password) submit_button.click() def tearDown(self): self.driver.implicitly_wait(5) self.driver.close() if __name__ == '__main__': unittest.main(verbosity=2)
Les comparto el código de la clase ya con documentación
import unittest from selenium import webdriver class RegisterNewUser(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_new_user(self): driver = self.driver #le decimos al driver que encuentre la opción de cuenta por su Xpath y le haga click para desplegar el menu driver.find_element_by_xpath('/html/body/div/div[2]/header/div/div[2]/div/a/span[2]').click() #el driver va a buscar el enlace por su texto y haga click driver.find_element_by_link_text('Log In').click() #creo una variable asociada al botón de crear cuenta create_account_button = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div/div[2]/form/div/div[1]/div[2]/a/span/span') #validamos que el botón esté visible y habilitado self.assertTrue(create_account_button.is_displayed() and create_account_button.is_enabled()) create_account_button.click() #comprueba que estamos en el sitio de crear cuenta self.assertEqual('Create New Customer Account', driver.title) #creación de variables con el nombre del selector correspondiente first_name = driver.find_element_by_id('firstname') last_name = driver.find_element_by_id('lastname') email_address = driver.find_element_by_id('email_address') password = driver.find_element_by_id('password') confirm_password = driver.find_element_by_id('confirmation') news_letter_subscription = driver.find_element_by_id('is_subscribed') submit_button = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div/div[2]/form/div[2]/button') #veremos si los elementos están habilitados self.assertTrue(first_name.is_enabled() and last_name.is_enabled() and email_address.is_enabled() and password.is_enabled() and confirm_password.is_enabled() and news_letter_subscription.is_enabled() and submit_button.is_enabled()) #mandamos los datos al formulario first_name.send_keys('Test') last_name.send_keys('Test') email_address.send_keys('arqcftlothxuknlxkt@awdrt.com') #sacado de 10-minute mail password.send_keys('Test') confirm_password.send_keys('Test') submit_button.click() def tearDown(self): self.driver.implicitly_wait(3) self.driver.close() if __name__ == "__main__": unittest.main(verbosity = 2)
Buena clase; personalmente estoy realizando las prácticas en docker sin la interfaz del navegador para mantener el entorno aislado del host, y tambien para afianzar los conocimientos en python hice algunos cambios: a las variables las almacené en un diccionario, para luego iterar y realizar las validaciones y envios de valores a cada una de las variables.
import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException class RegisterNewUser(unittest.TestCase): def setUp(self): options = webdriver.ChromeOptions() options.add_argument('--no-sandbox') options.add_argument('--headless') options.add_argument('--disable-gpu') self.driver = webdriver.Chrome(options=options) self.driver.get('http://demo-store.seleniumacademy.com/') def tearDow(self): self.driver.quit() def test_new_user(self): driver = self.driver try: driver.find_element_by_xpath('//*[@id="header"]/div/div[2]/div/a/span[2]').click() driver.find_element_by_link_text('Log In').click() create_account_button = driver.find_element_by_xpath('//*[@id="login-form"]/div/div[1]/div[2]/a') self.assertTrue(create_account_button.is_displayed() and create_account_button.is_enabled()) create_account_button.click() self.assertEqual('Create New Customer Account', driver.title) variables = { "first_name": driver.find_element_by_id('firstname'), "middle_name": driver.find_element_by_id('middlename'), "last_name": driver.find_element_by_id('lastname'), "email_address": driver.find_element_by_id('email_address'), "password": driver.find_element_by_id('password'), "confirm_password": driver.find_element_by_id('confirmation'), "is_subscribed": driver.find_element_by_id('is_subscribed'), "submit_button": driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div/div[2]/form/div[2]/button/span/span') } for key, val in variables.items(): self.assertTrue(val.is_enabled()) for key, val in variables.items(): if key == 'email_address': val.send_keys('Test@testing.com') continue if key == 'is_subscribed': continue if key == 'submit_button': val.click() break val.send_keys('Test') except NoSuchElementException as ex: self.fail(ex.msg) if __name__ == "__main__": unittest.main(verbosity = 2)
Codigo actualizado con el selenium y el registro de la pagina prueba q fue retirado el middle name
import unittest from selenium import webdriver class RegisterNewUser(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'.\chromedriver.exe') driver = self.driver driver.implicitly_wait(5) driver.maximize_window() driver.get("pagina a visitar") def test_new_user(self): driver = self.driver #le decimos al driver que encuentre la opción de cuenta por su Xpath y le haga click para desplegar el menu driver.find_element('xpath', '/html/body/div/div[2]/header/div/div[2]/div/a/span[2]').click() #el driver va a buscar el enlace por su texto y haga click driver.find_element('link text', 'Log In').click() #creo una variable asociada al botón de crear cuenta create_account_button = driver.find_element('xpath', '/html/body/div/div[2]/div[2]/div/div/div[2]/form/div/div[1]/div[2]/a/span/span') #validamos que el botón esté visible y habilitado self.assertTrue(create_account_button.is_displayed() and create_account_button.is_enabled()) create_account_button.click() #comprueba que estamos en el sitio de crear cuenta self.assertEqual('Create New Customer Account', driver.title) #creación de variables con el nombre del selector correspondiente first_name = driver.find_element('id', 'firstname') last_name = driver.find_element('id', 'lastname') email_address = driver.find_element('id', 'email_address') password = driver.find_element('id', 'password') confirm_password = driver.find_element('id', 'confirmation') news_letter_subscription = driver.find_element('id', 'is_subscribed') submit_button = driver.find_element('xpath', '/html/body/div/div[2]/div[2]/div/div/div[2]/form/div[2]/button') #veremos si los elementos están habilitados self.assertTrue(first_name.is_enabled() and last_name.is_enabled() and email_address.is_enabled() and password.is_enabled() and confirm_password.is_enabled() and news_letter_subscription.is_enabled() and submit_button.is_enabled()) #mandamos los datos al formulario first_name.send_keys('Test') last_name.send_keys('Testtest@mailito.com') #sacado de 10-minute mail password.send_keys('Test') confirm_password.send_keys('Test') submit_button.click() def tearDown(self): self.driver.implicitly_wait(3) self.driver.close() if __name__ == "__main__": unittest.main(verbosity = 2)
Comparto mi código fuente. Espero pueda ayudar.
import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver class SearchTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome("D:\webdriver-chrome/chromedriver.exe") driver = self.driver driver.implicitly_wait(50) driver.maximize_window() driver.get('https://demo-store.seleniumacademy.com/') def test_new_user(self): driver = self.driver driver.find_element_by_xpath('/html/body/div/div[2]/header/div/div[2]/div/a/span[2]').click() driver.find_element_by_link_text('Log In').click() create_account_buttom = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div/div[2]/form/div/div[1]/div[2]/a') self.assertTrue(create_account_buttom.is_displayed() and create_account_buttom.is_enabled()) create_account_buttom.click() self.assertEqual('Create New Customer Account', driver.title) first_name = driver.find_element_by_id('firstname') middle_name = driver.find_element_by_id('middlename') last_name = driver.find_element_by_id('lastname') email_address = driver.find_element_by_id('email_address') new_letter_suscription = driver.find_element_by_id('is_subscribed') password = driver.find_element_by_id('password') confirm_password = driver.find_element_by_id('confirmation') submit_button = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div/div[2]/form/div[2]/button') #Valida que este habilitado self.assertTrue( first_name.is_enabled() and middle_name.is_enabled() and last_name.is_enabled() and email_address.is_enabled() and password.is_enabled() and confirm_password.is_enabled() and new_letter_suscription.is_enabled() and submit_button.is_enabled() ) #Envia datos first_name.send_keys('Test') middle_name.send_keys('Test') last_name.send_keys('Test') email_address.send_keys('Test@gmail.com') password.send_keys('Test') confirm_password.send_keys('Test') new_letter_suscription.send_keys('Test') submit_button.send_keys('Test') def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main(verbosity=2,testRunner=HTMLTestRunner(output="reportes", report_name="prueba_asssert"))
Pudimos simular un registro de un usuario en la página con el siguiente código:
register_new_user.py:
import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver from selenium.webdriver.chrome.options import Options class RegisterNewUser(unittest.TestCase): @classmethod def setUpClass(cls): options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') cls.driver = webdriver.Chrome(executable_path = '/usr/bin/chromedriver' , options=options) driver = cls.driver driver.get('URLDELAWEB') def test_new_user(self): driver = self.driver driver.find_element_by_xpath('/html/body/div/div[2]/header/div/div[2]/div/a/span[2]').click() #Hacemos click en el elemento driver.find_element_by_link_text('Log In').click() create_account_button = driver.find_element_by_xpath('//*[@id="login-form"]/div/div[1]/div[2]/a/span/span') self.assertTrue(create_account_button.is_displayed() and create_account_button.is_enabled()) create_account_button.click() self.assertEqual('Create New Customer Account' , driver.title) #¿El título de la página web es igual al título del driver? #Creamos las variables para encontrar los elementos first_name = driver.find_element_by_id('firstname') middle_name = driver.find_element_by_id('middlename') last_name = driver.find_element_by_id('lastname') email_address = driver.find_element_by_id('email_address') news_letter_suscription = driver.find_element_by_id('is_subscribed') password = driver.find_element_by_id('password') #! No utilizar datos reales por la sensibilidad de los datos confirm_password = driver.find_element_by_id('confirmation') submit_button = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div/div[2]/form/div[2]/button/span/span') #Verificamos que los elementos estén habilitados self.assertTrue(first_name.is_enabled() and middle_name.is_enabled() and last_name.is_enabled() and email_address.is_enabled() and news_letter_suscription.is_enabled() and password.is_enabled() and confirm_password.is_enabled() and submit_button.is_enabled()) #Pretendemos llenar los campos first_name.send_keys('Test') middle_name.send_keys('Test') last_name.send_keys('Test') email_address.send_keys('Test@testingmail.com') password.send_keys('Test') confirm_password.send_keys('Test') news_letter_suscription.click() submit_button.click() @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main(verbosity = 2)