Royer Guerrero Pinilla
EstudianteJuan Zenón
EstudianteAriel Aracena Alvarez
EstudianteRicardo Cuéllar
EstudianteFredy Mendoza Vargas
EstudianteAntonio Demarco Bonino
EstudianteSandra Milena Rojas Herrán
EstudianteFrancisco Peñalo Feliz
Estudianteestefany Liza
EstudianteLuis Eduardo Lerena Pereira
Estudiantejason alejandro martinez jimenez
EstudianteLeonardo Ismael Hakim
EstudianteCristian David Restrepo Marin
EstudianteLeonardo Ismael Hakim
EstudianteIsmael Danilo Herrera Sánchez
EstudianteMiguel Ángel Carrillo Hernández
EstudianteEdgar Vallejo Curti
EstudianteHugo Gomez Tinoco
Estudianteoscar de la cruz
EstudianteANIBAL OZIEL ALVARADO CERVANTES
EstudianteHéctor Daniel Vega Quiñones
ProfesorANIBAL OZIEL ALVARADO CERVANTES
EstudianteMario Alexander Vargas Celis
EstudianteYoshie Garcés Rodríguez
EstudianteWilliam Daniel Avila Barbeito
EstudianteDiego Antonio Castellanos
EstudianteRubén Cuello
EstudianteJuan Carlos Ortiz Romero
EstudianteEnrique Uzcategui
EstudianteMiguel Angel Berrio Huamani
EstudianteJose Noriega
EstudianteSi les cuesta leer la pausa explicita siempre pueden formatear su codigo asi
WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#checkbox-example > button')) )
Incluso pueden identar aún más para que siga viéndose bien incluso en un espacio angosto como este.
WebDriverWait(driver, 15).until( EC.element_to_be_clickable( (By.CSS_SELECTOR, "#checkbox-example > button") ) )
Gracias
Excelente clase me quedo más claro que en la clase dedicado a Demora implicita y explicita. :)
Les comparto el código de la clase por si alguien tiene problemas en el futuro:
import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC #Esperas explicitas class DynamicControls(unittest.TestCase): #Prepara entorno de la prueba. def setUp(self): self.driver = webdriver.Chrome('chromedriver') driver = self.driver driver.get("http://the-internet.herokuapp.com/") driver.find_element_by_link_text('Dynamic Controls').click() #Casos de prueba def test_dynamic_controls(self): driver = self.driver checkbox = driver.find_element_by_css_selector("#checkbox > input[type=checkbox]") checkbox.click() remove_add = driver.find_element_by_css_selector("#checkbox-example > button") remove_add.click() #Webdriver wait (driver, espera). hasta que (EC.el elemento sea clickable(tupla)) tupla (por selector CSS, "Selector") WebDriverWait(driver,15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#checkbox > input[type=checkbox]"))) remove_add.click() enable_disable_button = driver.find_element_by_css_selector("#input-example > button") enable_disable_button.click() WebDriverWait(driver,15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#input-example > button"))) text_area = driver.find_element_by_css_selector("#input-example > input[type=text]") text_area.send_keys('Platzi') enable_disable_button.click() #Finalizar def tearDow(self): self.driver.quit() #Revisar con close if __name__ == "__main__": unittest.main(verbosity=2)
Muchas gracias
Me sirvió mucho tu código. Lo use para arreglar cosas que estaban mal en el mío. Muchas gracias por tu ayuda.
Yo tuve un problema durante mi codificación y el error que me salía era que los elementos no tenían el atributo clic, pues son una lista dentro del site:
Lo que yo hice fue iterar dentro de la lista y ahí si darle click al elemento. Así:
checkboxs = driver.find_elements_by_css_selector("#checkbox > input[type=checkbox]") for checkbox in checkboxs: checkbox.click()
Luego de haber implementado esto, el código me funciono sin ningún problema.
Les dejo el código completo:
from lib2to3.pgen2 import driver from pickletools import uint1 import unittest from venv import create from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By class DynamicControls(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'C://Users//saman//Downloads//Studies//Selenium_python//chromedriver_win32//chromedriver.exe') driver = self.driver driver.maximize_window() driver.get("Aquí va el site de prueba") driver.find_element_by_link_text('Dynamic Controls').click() def test_add_remove(self): driver = self.driver checkboxs = driver.find_elements_by_css_selector("#checkbox > input[type=checkbox]") for checkbox in checkboxs: checkbox.click() remove_add_buttons = driver.find_elements_by_css_selector('#checkbox-example > button') for remove_add_button in remove_add_buttons: remove_add_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#checkbox-example > button'))) remove_add_button.click() enable_disable_buttons = driver.find_elements_by_css_selector('#input-example > button') for enable_disable_button in enable_disable_buttons: enable_disable_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#input-example > button'))) text_areas = driver.find_elements_by_css_selector('#input-example > input[type=text]') for text_area in text_areas: text_area.send_keys('Los amo familia') for enable_disable_button in enable_disable_buttons: enable_disable_button.click() def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main(verbosity = 2)
Si tienen alguna otra duda, no duden en preguntar, aquí estamos para ayudarnos.... <3
@samantharojash veo que te retorna una lista de elementos porque usaste el método find_elements_by_css_selector en vez de find_element_by_css_selector.
Otra cosa es que en las versiones recientes de Selenium ya no existen dichos metodos que utilizar el profesor en los videos para buscar los elementos.
Para buscar un elemento debes usar el metodo find_element o para buscar una lista de elementos usar find_elements
Ejemplo:
driver.find_element(By.CSS_SELECTOR, '#checkbox-example > button')
Comparto mi código
import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.webdriver import WebDriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome import options class Dynamic_controls(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://the-internet.herokuapp.com/') driver.find_element_by_link_text("Dynamic Controls").click() def test_dynamic_controls(self): driver = self.driver checkbox = driver.find_element_by_css_selector("#checkbox > input[type=checkbox]") checkbox.click() remove_add_buttom = driver.find_element_by_css_selector("#checkbox-example > button") remove_add_buttom.click() WebDriverWait(driver,15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#checkbox-example > button"))) remove_add_buttom.click() enable_desable_buttom = driver.find_element_by_css_selector("#input-example > button") enable_desable_buttom.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#input-example > button"))) text_area = driver.find_element_by_css_selector("#input-example > input[type=text]") text_area.send_keys('Platzi') enable_desable_buttom.click() def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main(verbosity=2,testRunner=HTMLTestRunner(output="reportes", report_name="prueba_asssert"))
import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep class DynamicControls(unittest.TestCase): @classmethod def setUpClass(self): self.driver = webdriver.Chrome(executable_path=r'C:/Users/Usuario/Documents/platzi/python/Clases del Curso de Introducción a Selenium con Python/chromedriver.exe') driver = self.driver driver.get('https://the-internet.herokuapp.com/') driver.maximize_window() driver.find_element(By.LINK_TEXT, 'Dynamic Controls').click() def test_add_remove(self): driver = self.driver button_remove = driver.find_element(By.XPATH, '//*[@id="checkbox-example"]/button[contains(text(),"Remove")]') button_remove.click() button_add = WebDriverWait(driver=driver, timeout=10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="checkbox-example"]/button[contains(text(),"Add")]'))) paragraph = driver.find_element(By.XPATH, '//*[@id="message"][contains(text(),"It\'s gone!")]') button_add.click() button_remove = WebDriverWait(driver=driver, timeout=10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="checkbox-example"]/button[contains(text(),"Remove")]'))) paragraph = driver.find_element(By.XPATH, '//*[@id="message"][contains(text(),"It\'s back!")]') def test_enable_disable(self): driver = self.driver button_action = driver.find_element(By.XPATH, '//*[@id="input-example"]/button[contains(text(),"Enable")]') button_action.click() self.status_field(self.get_input()) button_action.click() self.status_field(self.get_input()) def get_input(self): return WebDriverWait(driver=self.driver, timeout=10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="input-example"]/input'))) def status_field(self, input_enable): sleep(3) if input_enable.is_enabled(): print('The field is enable.') else: print('The field is disable.') @classmethod def tearDownClass(self): driver = self.driver driver.close() driver.quit() if __name__ == '__main__': unittest.main(verbosity=1)
Aquí esta el código actualizado, hay que hacerle unos cambios al css selector en el primer webdriver que usamos, ya que el css selector de remove no es el mismo que el de add :D ( agregue unos sleeps de mala practica abajo para que se logre ver la diferencia xD si pudiste quitar esos sleeps con algún webdriver me gustaría verlo UwU
from time import sleep import unittest from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver class DynamicControls(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'inserta tu acceso rapido') driver = self.driver driver.get('inserte link') driver.find_element_by_link_text('Dynamic Controls').click() def test_dynamic_controls(self): driver = self.driver checkbox = driver.find_element_by_css_selector('#checkbox > input:nth-child(1)') checkbox.click() remove_add_button = driver.find_element_by_css_selector('#checkbox-example > button:nth-child(2)') remove_add_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#checkbox-example > button:nth-child(1)'))) remove_add_button.click() enable_disable_button = driver.find_element_by_css_selector('#input-example > button:nth-child(2)') enable_disable_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#input-example > button:nth-child(2)'))) text_area = driver.find_element_by_css_selector('#input-example > input:nth-child(1)') text_area.click() sleep(3) text_area.send_keys('Hola') sleep(3) enable_disable_button.click() def tearDown(self): self.driver.close() if __name__ == '__main__': unittest.main()
Hace varios dias que no funciona el sitio de prácticas. Lo van a solucionar en algun momento?? Se hace dificil seguir las practicas sin este sitio porq no es facil encontrar otro tan especifico. Gracias
Hola leonardo-ismael-hakim la pagina de pruebas https://the-internet.herokuapp.com/ se encuentra activa y funcionando. Saludos!
Siii, luego me di cuenta que estaba mal la URL. Gracias!!
A alguien le sale este error?
Si te sale es porque en tu codigo estas utilizando:
checkbox = driver.find_elements_by_css_selector("#checkbox > input[type=checkbox]")
En vez de:
checkbox = driver.find_element_by_css_selector("#checkbox > input[type=checkbox]")
Sip el error es porque nos equivocamos en la letra "s"
Hola alguien sabe, porque si utilizo
Para revisar que no este el elemento si funciona
WebDriverWait(driver, 120).until(EC.invisibility_of_element(checkbox))
#WebDriverWait(driver, 60).until_not(EC.invisibility_of_element(checkbox))
También probe en su versión visibility_of_element, pero el resultado fue el mismo.
Pero si utilizo para revisar que si este no funciona
def test_dynamic_checkbox(self): driver = self.driver
checkbox = driver.find_element_by_xpath('//*[@id="checkbox"]') checkbox_xpath = '//*[@id="checkbox"]' checkbox_button = driver.find_element_by_xpath('//*[@id="checkbox-example"]/button') checkbox_button.click() WebDriverWait(driver, 120).until(EC.invisibility_of_element(checkbox)) checkbox_button.click() WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.XPATH, checkbox_xpath))) # Con el de abajo no funciona #WebDriverWait(driver, 60).until_not(EC.invisibility_of_element(checkbox))
Creo que es por la forma como pasas el parametro <checkbox>. Si mal no recuerdo, debería ser una tupla con un By y la referencia del checkbox.
Te falta un paréntesis y el By en
checkbox_button.click() WebDriverWait(driver, 120).until(EC.invisibility_of_element(checkbox)) #Debería ser checkbox_button.click() WebDriverWait(driver, 120).until(EC.invisibility_of_element((BY.NAME, 'checkbox')))
Buenos dias, debo realizar la descarga de un archivo desde una url, pero no se cuanto tiempo se demora hacerlo. A prueba y error he logrado dejar el navegador abierto 30 segundos "sleep(30)" y funciona. No creo que sea la mejor opción ¿Como puedo condicionar el cierre del navegador una vez se halla descargado el archivo?. Adjunto el codigo que estoy utlizando. Gracias.
import unittest from time import sleep from selenium import webdriver class BankRep(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path='../driver/chromedriver') def test_download_monedas_disponible(self): driver = self.driver driver = self.driver driver.get('https://totoro.banrep.gov.co/analytics/saw.dll?Go&NQUser=publico&NQPassword=publico123') driver.get('https://totoro.banrep.gov.co/analytics/saw.dll?Go&NQUser=publico&NQPassword=publico123&Path=/shared/Series%20Estad%C3%ADsticas_T/1.%20Monedas%20disponibles/1.3.TCM_Descarga_CSV_XML&download_type=csv&lang=es') # Espera 30 segundo mientras se realiza la descarga del archivo de texto sleep(30) def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main(verbosity=2)
Hola :
Alguien sabrá porque cuando corro los códigos, que si los ejecuta exitosamente, sale un mensaje al inicio : DevTools listening on ws:
favor de apoyarme con lo anterior.
¡Saludos !
Atte.
Aníbal
Posiblemente esto se deba a que el driver que estás utilizando esté desactualizado y debas descargar el de la versión actual de tu navegador.
Hola Héctor :
Gracias por tu aporte.
Tengo otra pregunta, acabo de terminar el curso de SELENIUM, pero tuve problemas para que se cargara el navegador de WEBDRIVER desde WSL2, tuve que pasarme a CMDER para poder accesar el WEBDRIVER.
La pregunta es si en WSL2 no es posible ver gráficamente SELENIUM ?.
¡Saludos!
Atte.
Aníbal
Mi codigo:
import unittest from selenium import webdriver from pyunitreport import HTMLTestRunner from selenium.webdriver.common.by import By #from time import sleep from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class DynamicControls(unittest.TestCase): def setUp(self): chrome_driver_path = r"/chromedriver.exe" self.driver = webdriver.Chrome() driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("https://the-internet.herokuapp.com/") driver.find_element(By.LINK_TEXT, "Dynamic Controls").click() def test_dynamic_controls(self): driver = self.driver checkbox = driver.find_element(By.CSS_SELECTOR, '#checkbox > input[type=checkbox]') checkbox.click() remove_add_button = driver.find_element(By.CSS_SELECTOR, '#checkbox-example > button') remove_add_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#checkbox-example > button'))) remove_add_button.click() enable_disable_button = driver.find_element(By.CSS_SELECTOR, '#input-example > button') enable_disable_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#input-example > button'))) text_area = driver.find_element(By.CSS_SELECTOR, '#input-example > input[type=text]') text_area.send_keys('Platzi') enable_disable_button.click() def tearDown(self) -> None: self.driver.close() if __name__ == "__main__": unittest.main(verbosity = 2, testRunner = HTMLTestRunner(output = "reportes", report_name = "dynamic_controls_test_report")) ```import unittestfrom selenium import webdriverfrom pyunitreport import HTMLTestRunnerfrom selenium.webdriver.common.by import By#from time import sleepfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected\_conditions as EC class DynamicControls(unittest.TestCase):   def setUp(self): chrome\_driver\_path = r"/chromedriver.exe" self.driver = webdriver.Chrome() driver = self.driver driver.implicitly\_wait(30) driver.maximize\_window() driver.get("https://the-internet.herokuapp.com/") driver.find\_element(By.LINK\_TEXT, "Dynamic Controls").click()   def test\_dynamic\_controls(self): driver = self.driver   checkbox = driver.find\_element(By.CSS\_SELECTOR, '#checkbox > input\[type=checkbox]') checkbox.click()   remove\_add\_button = driver.find\_element(By.CSS\_SELECTOR, '#checkbox-example > button') remove\_add\_button.click()   WebDriverWait(driver, 15).until(EC.element\_to\_be\_clickable((By.CSS\_SELECTOR, '#checkbox-example > button'))) remove\_add\_button.click()   enable\_disable\_button = driver.find\_element(By.CSS\_SELECTOR, '#input-example > button') enable\_disable\_button.click()   WebDriverWait(driver, 15).until(EC.element\_to\_be\_clickable((By.CSS\_SELECTOR, '#input-example > button')))   text\_area = driver.find\_element(By.CSS\_SELECTOR, '#input-example > input\[type=text]') text\_area.send\_keys('Platzi')   enable\_disable\_button.click()   def tearDown(self) -> None: self.driver.close() if \_\_name\_\_ == "\_\_main\_\_": unittest.main(verbosity = 2, testRunner = HTMLTestRunner(output = "reportes", report\_name = "dynamic\_controls\_test\_report"))
Dejo mi version con reporte y realizaco con XPATH
import unittest from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from pyunitreport import HTMLTestRunner class DynamicControls(unittest.TestCase): @classmethod def setUpClass(cls): # Configurar el WebDriver y abrir la página web cls.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver = cls.driver driver.get('URL') driver.implicitly_wait(10) driver.maximize_window() driver.find_element(By.LINK_TEXT, 'Dynamic Controls').click() #Se define el método de prueba test_remove_checkbox(). Este método realiza las siguientes acciones: #Espera a que el elemento de checkbox sea visible. #Hace clic en el checkbox. #Encuentra el botón de eliminar mediante su XPath. #Verifica que el checkbox esté visible. #Hace clic en el botón de agregar nuevamente. def test_remove_checkbox(self): driver = self.driver checkbox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'checkbox'))) checkbox.click() remove_button = driver.find_element(By.XPATH, '//*[@id="checkbox-example"]/button') self.assertTrue(checkbox.is_displayed()) remove_button.click() checkbox = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="checkbox-example"]/button'))) checkbox.click() #Se define el método de prueba test_enable_text_field(). Este método realiza las siguientes acciones: #Encuentra el botón de habilitar mediante su XPath. #Encuentra el campo de texto mediante su XPath. #Verifica que el campo de texto no esté habilitado. #Hace clic en el botón de habilitar. #Espera a que el campo de texto sea clicable. #Ingresa un texto de prueba en el campo de texto. #Encuentra el botón de deshabilitar mediante su XPath. def test_enable_text_field(self): driver = self.driver enable_button = driver.find_element(By.XPATH, '//*[@id="input-example"]/button') text_field = driver.find_element(By.XPATH, '//*[@id="input-example"]/input') self.assertFalse(text_field.is_enabled()) enable_button.click() text_field = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="input-example"]/input'))) text_field.send_keys("Texto de prueba") disable_button = driver.find_element(By.XPATH, '//*[@id="input-example"]/button') disable_button.click() #Se define el método tearDownClass() con el decorador @classmethod. Este método se ejecuta después de todas las pruebas de la clase y se encarga de cerrar el WebDriver. @classmethod def tearDownClass(cls): cls.driver.quit() #Se verifica si el archivo se está ejecutando directamente y no siendo importado como un módulo. En caso afirmativo, se ejecuta unittest.main() para ejecutar las pruebas y generar el informe HTML. if __name__ == "__main__": unittest.main(testRunner=HTMLTestRunner(output='reportes', report_name='dynamic_controls'))
Dejo aquí mi versión (firefox)
import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep class DynamicControls(unittest.TestCase): @classmethod def setUpClass(self): self.driver = webdriver.Firefox(executable_path = r'.\geckodriver.exe') driver = self.driver driver.get('URL') driver.maximize_window() driver.implicitly_wait(10) def test_remove_add_button(self): driver = self.driver remove_button = driver.find_element(By.XPATH, '//*[@id="checkbox-example"]/button[contains(text(),"Remove")]') remove_button.click() self.validate_paragraph_text("It's gone!") button_add = driver.find_element(By.XPATH, '//*[@id="checkbox-example"]/button[contains(text(),"Add")]') button_add.click() self.validate_paragraph_text("It's back!") remove_button.click() self.validate_paragraph_text("It's gone!") def test_enable_disable(self): driver = self.driver enable_disable_button = driver.find_element(By.XPATH, '/html/body/div[2]/div/div[1]/form[2]/button') enable_disable_button.click() self.validate_paragraph_text("It's enabled!") enable_disable_button.click() self.validate_paragraph_text("It's disabled!") enable_disable_button.click() self.validate_paragraph_text("It's enabled!") def validate_paragraph_text(self, expectedText): paragraph = self.driver.find_element(By.CSS_SELECTOR, '#message') paragraph_text = paragraph.text self.assertEqual(paragraph_text, expectedText) @classmethod def tearDownClass(self): driver = self.driver driver.close() driver.quit() if __name__ == '__main__': unittest.main(verbosity=1)
Recuedren que el CSS_SELECTOR del botón Remove/Add son diferentes.
Muy entretenido la verdad. Me salió a la primera por suerte :smile:
import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class DynamicControl(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path= './chromedriver') driver = self.driver driver.get('https://the-internet.herokuapp.com/') driver.find_element_by_link_text('Dynamic Controls').click() def test_check_box(self): driver = self.driver checkbox= driver.find_element_by_css_selector('#checkbox') checkbox.click() remove_add_button = driver.find_element_by_css_selector('#checkbox-example > button') remove_add_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#checkbox-example > button"))) remove_add_button.click() enable_disable_button = driver.find_element_by_css_selector('#input-example > button') enable_disable_button.click() WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#input-example > button'))) text_area = driver.find_element_by_css_selector('#input-example > input[type=text]') text_area.send_keys('Jeyfred') enable_disable_button.click() def test_button_enabled(self): pass def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main(verbosity = 2)
Este fue mi solución antes de ver la clase
import unittest from selenium import webdriver from selenium.webdriver.common.by import By # Helps get elements through selectors for interaction from selenium.webdriver.support.ui import WebDriverWait # Helps uses expected conditions and explicit waits from selenium.webdriver.support import expected_conditions as EC class AddRemoveElements(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path='./chromedriver') driver = self.driver driver.get('Ya saben') driver.find_element_by_link_text('Dynamic Controls').click() def test_add_remove_checkbox(self): driver = self.driver remove_checkbox_btn = driver.find_element_by_xpath( '/html/body/div[2]/div/div[1]/form[1]/button' ) remove_checkbox_btn.click() message = WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located((By.ID, 'message'))) if message.text == "It's gone!": add_checkbox_btn = remove_checkbox_btn add_checkbox_btn.click() message = WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located((By.ID, 'message'))) if message.text == "It's back!": print('Button removed and added successfully!') checkbox = driver.find_element_by_id('checkbox') checkbox.click() WebDriverWait(self.driver, 10).until( EC.element_to_be_selected(checkbox)) def test_enable_disable_input(self): driver = self.driver enable_input_btn = driver.find_element_by_xpath( '/html/body/div[2]/div/div[1]/form[2]/button' ) enable_input_btn.click() input_xpath = '/html/body/div[2]/div/div[1]/form[2]/input' input = WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.XPATH, input_xpath))) if input.is_enabled: disable_input_btn = enable_input_btn input.send_keys("It's working!") disable_input_btn.click() message = WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located((By.ID, 'message'))) if message.text == "It's disabled!": print('Button enabled and disabled successfully!') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)
Comparto mi solución. Tal vez falta optimizar algunas cosas. Pero es funcional.
import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait class Reto3(unittest.TestCase): def setUp(self) -> None: self.driver = webdriver.Edge(executable_path="./msedgedriver.exe") driver = self.driver driver.maximize_window driver.get("https://the-internet.herokuapp.com") def test3(self): self.driver.find_element_by_link_text("Dynamic Controls").click() self.driver.find_element_by_xpath('//*[@id="checkbox"]/input').click() self.driver.find_element_by_xpath( '//*[@id="checkbox-example"]/button').click() button_remove = WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="checkbox-example"]/button'))) button_remove.click() WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="checkbox-example"]/button'))) button_activate_deactivate = self.driver.find_element_by_xpath( '//*[@id="input-example"]/button') button_activate_deactivate.click() test = WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, '//*[@id="input-example"]/input'))) test.send_keys("Hola") button_activate_deactivate.click() WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="input-example"]/button'))) def tearDown(self) -> None: self.driver.close() if __name__ == "__main__": unittest.main(verbosity=2)
Reto
from os import remove import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from common import SERVICE from common import CHROME_OPTIONS class DynamicElementsTestCase(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.driver = webdriver.Chrome( service=SERVICE, options=CHROME_OPTIONS, ) cls.driver.get('https://the-internet.herokuapp.com/dynamic_controls') cls.driver.maximize_window() cls.driver.implicitly_wait(1) def test_async_remove_add(self): remove_add_button: WebElement remove_add_button = self.driver.find_element(By.XPATH, '//*[@id="checkbox-example"]/button') self.assertEqual(remove_add_button.text, 'Remove') self.driver.find_element(By.ID, 'checkbox') # Remove remove_add_button.click() WebDriverWait(self.driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, '//*[@id="checkbox-example"]/button'))) self.assertEqual(remove_add_button.text, 'Add') # Add remove_add_button.click() WebDriverWait(self.driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, '//*[@id="checkbox-example"]/button'))) self.assertEqual(remove_add_button.text, 'Remove') self.driver.find_element(By.ID, 'checkbox') def test_async_enable_disabled(self): toggle_button: WebElement toggle_button = self.driver.find_element(By.XPATH, '//*[@id="input-example"]/button') self.assertEqual(toggle_button.text, 'Enable') self.assertFalse(self.driver.find_element(By.XPATH, '//*[@id="input-example"]/input').is_enabled()) # Enable toggle_button.click() WebDriverWait(self.driver, 10).until(expected_conditions.invisibility_of_element_located((By.XPATH, '/html/body/div[2]/div/div[1]/form[2]/div'))) self.assertEqual(toggle_button.text, 'Disable') self.assertTrue(self.driver.find_element(By.XPATH, '//*[@id="input-example"]/input').is_enabled()) # Disable toggle_button.click() WebDriverWait(self.driver, 10).until(expected_conditions.invisibility_of_element_located((By.XPATH, '/html/body/div[2]/div/div[1]/form[2]/div'))) self.assertEqual(toggle_button.text, 'Enable') self.assertFalse(self.driver.find_element(By.XPATH, '//*[@id="input-example"]/input').is_enabled()) @classmethod def tearDownClass(cls) -> None: cls.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)