Manejar form, textbox, checkbox y radio button
Clase 10 de 24 • Curso de Introducción a Selenium con Python
Contenido del curso
Clase 10 de 24 • Curso de Introducción a Selenium con Python
Contenido del curso
Andres Felipe Henao
Julian Crispin
Andrés Corral
Korpi delfin
Fredy Mendoza Vargas
karen gonzalez
DIANA SOFIA AGUDELO MENDEZ
Diego Diego
Julian Crispin
Pablo Emilio Escobar Ossa
Carlos Andres Ocampo Pabon
Jorge Heli Rueda Uribe
fidel angel ochoa
Andres Felipe Galeano
francisco ecatl melo valle
Alejandro Orozco
Gersom Gezzer García Sánchez
Victor Martin Ortiz Palacio
Leslie Paz Ore
fidel angel ochoa
Royer Guerrero Pinilla
Héctor Daniel Vega Quiñones
Mateo Dellacasa
Michael Forero Chaux
Bruno Marcelo Lara Sainz
CRISTIAN FELIPE ROA CANO
Kevin Echenique
Junior Peves
estefany Liza
Jesús Enrique Morocoima Marcano
Miguel Angel Reyes Moreno
Gabriel Oswaldo Giraldo Martínez
Sebastián Andrade
Enso Vergara Gutierrez
Sebastián Andrade
Juan Sebastian Avila
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)
Parece interesante, lo voy a probar y te cuento
Me sirvio muchisimo lo de la API mil gracias!
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)
Gracias por el detalle
gracias por esto! de verdad que ayuda muchisimo!
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.
me acaba de pasar lo mismo si no leo esto no me doy cuenta, jaja gracias :)
Tambien me paso igual y estaba desesperado, gracias por tu post
Hola, Me encanta el curso, quiero hacer enfasis en que hay que tener mucho cuidado al momento de llama run elemento con el driver.find_element ya que, en mi caso, ponía driver.find_element[s] y esto me ocasinaba que buscara elementos dentro d euna lista, lo cual no es así para los campos inputs dentro de un formulario.
Me parece interesante esto, ya que me ahorraría mucho tiempo haciendo las pruebas que hago cuando estoy testeando un formulario de creación o modificación.
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?
Me pasa igual.
a mi igual
Hola compas,
Les dejo el link de una libreria para generar datos fake y que puedan usarlos para pruebas:
https://www.kabytes.com/programacion/generador-de-datos-falsos-python/
en lugar de usar
driver.explicitly_wait()
yo usé
time.sleep()
Ya que driver.explicitly_wait() no pausa el programa
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.
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.
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)
Wow, acabo de leer tu Código. Me parece genial lo de la implementación del diccionario, lo intentaré.
interesante, aunque no comprendo completamnete el codigo intuyo un poco el funcionameinto, estaria genial si lo explicaras "explicitamente".
Me gusto mucho la clase, esto ya es un poco más práctico en fines de testing
Así es Elliot, aunque Selenium no esté netamente hecho para el testing puede ayudarte a hacer pruebas replicando acciones humanas :)
No entiendo la razon por la cual estas clases tienen tan pocos aportes. Es un tema muy interesante para realizar el curso
Uy esto es una maravilla!, voy a programar una rutina para que se diligencia la encuesta de salud por si misma, jajajaja
esta clase me parece muy util y mejor explicada
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
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)
Hola les comparto mis anotaciones :D
Selenium Notion
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"))
buena... gracias
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)
To respuesta me ayudó a que finalmente corriera la prueba correctamente en windows 10. Sin esas lineas de opciones no lo hubiera logrado
Hola, que son variables de enterno?
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.
Si, me referia a entorno, muchas gracias :)
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