Si 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'))
)
Si 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'))
)
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)
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
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
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))
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)
Royer Guerrero Pinilla
Si 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')) )
Juan Zenón
Ariel Aracena Alvarez
Gracias
Ricardo Cuéllar
Fredy Mendoza Vargas
Muchas gracias
Antonio Demarco Bonino
Me sirvió mucho tu código. Lo use para arreglar cosas que estaban mal en el mío. Muchas gracias por tu ayuda.
Sandra Milena Rojas Herrán
Francisco Peñalo Feliz
@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')
estefany Liza
Luis Eduardo Lerena Pereira
jason alejandro martinez jimenez
Leonardo Ismael Hakim
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
Cristian David Restrepo Marin
Hola leonardo-ismael-hakim la pagina de pruebas https://the-internet.herokuapp.com/ se encuentra activa y funcionando. Saludos!
Leonardo Ismael Hakim
Siii, luego me di cuenta que estaba mal la URL. Gracias!!
Ismael Danilo Herrera Sánchez
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"
Miguel Ángel Carrillo Hernández
Edgar Vallejo Curti
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.
Hugo Gomez Tinoco
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')))
oscar de la cruz
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)
ANIBAL OZIEL ALVARADO CERVANTES
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
Héctor Daniel Vega Quiñones
ProfesorPosiblemente 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.
ANIBAL OZIEL ALVARADO CERVANTES
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
Mario Alexander Vargas Celis
Yoshie Garcés Rodríguez
William Daniel Avila Barbeito
Diego Antonio Castellanos
Recuedren que el CSS_SELECTOR del botón Remove/Add son diferentes.
Rubén Cuello
Muy entretenido la verdad. Me salió a la primera por suerte :smile:
Juan Carlos Ortiz Romero
Enrique Uzcategui
Miguel Angel Berrio Huamani
Jose Noriega
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") ) )
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)
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
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()
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))
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)
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)