Elementos dinámicos
Clase 17 de 24 • Curso de Introducción a Selenium con Python
Contenido del curso
Clase 17 de 24 • Curso de Introducción a Selenium con Python
Contenido del curso
Alejandro Andrade Soriano
Héctor Daniel Vega Quiñones
HERNAN DARIO VELASQUEZ ORTIZ
Carlos Andres Ocampo Pabon
Mario Barbosa
Mitchell Mirano
Sebastian Granda Gallego
Antoine J. Manuel Gutierrez.
Fredy Mendoza Vargas
Royer Guerrero Pinilla
Roberto Andres Viruete Gonzalez
Usuario anónimo
Georgina Paulina Cuadriello Ramírez
Héctor Daniel Vega Quiñones
Steven Moreno
Alberto Perdomo
Steven Moreno
Yoshie Garcés Rodríguez
Mario Alexander Vargas Celis
daniel saltarin castillo
Luis Lira
Miguel Angel Reyes Moreno
Bruno Guillaume Hernández Villamil
Jhonatan David Ibarra Lavado
Antonio Demarco Bonino
José Manuel Piña Rodríguez
Héctor Daniel Vega Quiñones
Enrique Uzcategui
Héctor Daniel Vega Quiñones
Sebastián Andrade
Sebastián Andrade
Emilio Ciappi
Que buen profesor. Mis respetos. Su forma de explicar es muy clara. Lo mejor es que usa variables y todo en ingles. <3
Muchas gracias por tus comentarios, Alejandro. Espero que estés disfrutando del curso :)
Y no solo eso, también se toma el tiempo de leer los comentarios y responder, son muy pocos los que hacen eso.
Comparto mi versión de este ejercicio. Lo que hice fue usar la función find_elemets_by_tag_name para sacar todos los elementos que son 'li'. Luego hice loop hasta que la cantidad de elementos que encontrara fueran 5.
import unittest from selenium import webdriver from time import sleep class DynamicElement(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path=r'chromedriver.exe') driver = self.driver driver.maximize_window() driver.implicitly_wait(10) driver.get('https://the-internet.herokuapp.com/') driver.find_element_by_link_text('Disappearing Elements').click() def test(self): driver = self.driver intentos = 1 #Capturo los elementos de la lista elements = driver.find_elements_by_tag_name('li') while len(elements) < 5: #Si los elementos que encontré son menores a 5 recargo la pagina y vuelvo a "contar" los elementos de la lista print('Elementos en la lista', len(elements)) driver.refresh() elements = driver.find_elements_by_tag_name('li') #Sumo otro intento intentos += 1 #Espero 1 segundo para que poder ver cuántas veces ha recargado sleep(1) print(f'Nos tomó {intentos} intentos para capturar a Gallery') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)
def test_name_elements(self): driver = self.driver len_menu = 5 tries = 0 menu = [] while len(menu) < len_menu: tries += 1 menu = driver.find_elements_by_xpath('//*[@id="content"]/div/ul/li') driver.refresh() print(f"number of tries: {tries}")
Yo conoci selenium caundo estaba haciendo Web Scraping de paginas dinamicas...pero no imagine que tenia todo este potencial.
Este es mi aporte, lo realice pensando en que el primer caso puede ser el resultado que se necesita:
def test_name_elements(self): driver = self.driver tries = 1 menu = driver.find_elements_by_xpath('//*[@id="content"]/div/ul/li') sleep(2) while len(menu) < 5: tries += 1 driver.refresh() sleep(2) menu = driver.find_elements_by_xpath('//*[@id="content"]/div/ul/li') print(f'Number of tries: {tries}')```
esta buena bro
Gracias viejo!
Hay esta otra version que hice
def test_name_elements_pro(self): driver = self.driver tries = 1 while True: menu = driver.find_elements_by_css_selector('.example > ul > li') for i in menu: print(i.text) print('--- ' * 5) if len(menu) < 5: tries += 1 driver.refresh() else: break print(f"Finish in {tries} tries")```
el codigo del profesor en esta clase no me gusto para nada, se complica solito, para empezar podriamos utilizar driver.find_elementS lo cual retornaria una lista y solo mediriamos el tamaño de esta, podriamos iterar sobre cada elemento para obtener su texto sin necesidad de utilizar un indice como lo muestra el profesor
import unittest from selenium import webdriver from time import sleep class DynamicElements(unittest.TestCase): def setUp(self): self.driver= webdriver.Chrome(executable_path= "/home/yanina/Downloads/chromedriver") driver= self.driver driver.get("http://the-internet.herokuapp.com/") driver.find_element_by_link_text("Disappearing Elements").click() def test_name_elements(self): driver = self.driver options= [] menu = 5 tries = 1 while len(options) < 5: options.clear() for i in range(menu): try: option_name= driver.find_element_by_xpath(f"/html/body/div[2]/div/div/ul/li[{i+1}]/a") options.append(option_name.text) print(options) except: print(f"Option number {i+1} is not found") tries= tries +1 driver.refresh() print(f"Finished in {tries} tries") def tearDown(self): self.driver.close() if __name__== '__main__': unittest.main(verbosity=2)``` Código realizado. :D
Podrían subir los archivos de los ejemplos como en los otros cursos? Please
Hola, acá puedes encontrar el repositorio con los archivos del curso :D https://github.com/terranigmark/curso-selenium-platzi
Hola, creo que 'tries += 1'. Va dentro del bloque de ‘try’ en vez de ‘except’
Yo creo que no, porque si pasa los comandos de try, termina el loop, por lo que si a la primera vez encuentra gallery quedaria con dos intentos cuando solo fue uno.
Tambien cambie el inicializador a '0' envitando precisamente esto :)
Realice el codigo y agregue reporteria
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 from time import sleep class Disappearing_elements(unittest.TestCase): @classmethod def setUpClass(cls) -> None: # 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(3) driver.maximize_window() driver.find_element(By.LINK_TEXT, 'Disappearing Elements').click() def test_name_elements(self): driver = self.driver options = [] menu = 5 tries = 1 while len(options) < 5: options.clear() for i in range(menu): try: option_name = driver.find_element(By.XPATH, (f"/html/body/div[2]/div/div/ul/li[{i + 1}]/a")) options.append(option_name.text) print(options) except: print(f"Option Number {i + 1} is Not FOUND") tries += 1 driver.refresh() print(f"Finished in {tries} tries") #Para que en python me tome la variable debo colocar la f delante @classmethod def tearDownClass(cls) -> None: cls.driver.quit() if __name__ == "__main__": # Ejecutar las pruebas y generar el informe HTML unittest.main(verbosity=2, testRunner=HTMLTestRunner(output='reportes', report_name='dynamic_element'))
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 DynamicElements(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, "Disappearing Elements").click() def test_name_elements(self): driver = self.driver options = [] menu = 5 tries = 1 while len(options) < 5: options.clear() for i in range(menu): try: option_name = driver.find_element(By.XPATH, f'//*[@id="content"]/div/ul/li[{i + 1}]/a') options.append(option_name.text) print(options) except: print(f"Option number {i + 1} is NOT FOUND") tries += 1 driver.refresh() print(f"Finished in {tries} tries") def tearDown(self) -> None: self.driver.close() if __name__ == "__main__": unittest.main(verbosity = 2, testRunner = HTMLTestRunner(output = "reportes", report_name = "dynamic_elements_test_report")) ```import unittestfrom selenium import webdriverfrom pyunitreport import HTMLTestRunnerfrom 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 DynamicElements(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, "Disappearing Elements").click()   def test\_name\_elements(self): driver = self.driver   options = \[] menu = 5 tries = 1   while len(options) < 5: options.clear()   for i in range(menu): try: option\_name = driver.find\_element(By.XPATH, f'//\*\[@id="content"]/div/ul/li\[{i + 1}]/a') options.append(option\_name.text) print(options) except: print(f"Option number {i + 1} is NOT FOUND") tries += 1 driver.refresh()   print(f"Finished in {tries} tries")   def tearDown(self) -> None: self.driver.close() if \_\_name\_\_ == "\_\_main\_\_": unittest.main(verbosity = 2, testRunner = HTMLTestRunner(output = "reportes", report\_name = "dynamic\_elements\_test\_report"))
¿es posible descargar algún archivo de manera automatica con selenium?
Tal vez esto pueda ayudarte para lo que intentas hacer :D https://medium.com/@moungpeter/how-to-automate-downloading-files-using-python-selenium-and-headless-chrome-9014f0cdd196
Nuevamente, por alguna extraña razón el profe está usando la url incorrecta.
Debe ser esta: driver.get('https://the-internet.herokuapp.com/disappearing_elements')
No es que esté usando la URL incorrecta, lo que pasa es que en el setUp primero le dice a Selenium que entre a la página y luego que encuentre el link del ejercicio y le dé click:
#Para acceder la URL driver.get("<URL_HEROKU>") #Para encontrar y dar click en el apartado correcto driver.find_element_by_link_text('Disappearing Elements').click()
woooo, selnium y su magia jajaja
A seguir sumando experiencia.
Excelente profe, al principio fue muy abrumador todo , pero ahora esta mas claro todo.
Por eso es que nunca debes para de aprender ;) Cuando creemos saber un lenguaje siempre aparecerá alguna tecnología para dominar y practicar.
¿Cuál es la diferencia entre copiar el Xpath y el full Xpath? En qué caso debería usar uno o el otro?
Eligiendo la opción XPath te traerá el XPath relativo, el cual es más corto pues comienza desde un punto intermedio hasta el elemento que quieres utilizar. Mientras que Full XPath traerá el XPath absoluto el cual es la lista completa de nodos que van desde la raíz del HTML hasta el elemento.
/html/body/div[2]/div[1]/div/h4[1]/b/html[1]/body[1]/div[2]/div[1]/div[1]/h4[1]/b[1]
//div[@class='featured-box cloumnsize1']//h4[1]//b[1]
En general se recomienda utilizar el relativo ya que el menos cambio en el absoluto hará que falle la localización del elemento.
Yo hice el reto antes de ver el video para comparar mi script con el del profesor, aqui mi solucion, el mio cuenta los refresh a partir de 0 porque ya me acostumbre a contar desde 0 xd
import unittest import time from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Disappering_elements(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = '../chromedriver') driver = self.driver driver.get('https://the-internet.herokuapp.com/disappearing_elements') driver.maximize_window() driver.implicitly_wait(3) def test_dissappering(self): driver = self.driver counter = 0 while True: time.sleep(2) try: WebDriverWait(driver, 3).until( EC.presence_of_element_located((By.XPATH, '//*[@id="content"]/div/ul/li[5]/a') ) ) break except TimeoutException: counter += 1 driver.refresh() continue print(f'I had to refresh {counter} times!') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)
en una de las veces que corri el script tuvo que refrescar 6 veces xd
Lo hice antes de ver el vídeo y así quedó mi código:
import unittest from selenium import webdriver from selenium.webdriver.common.by import By import time class DinamicsElemets(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'C:\chrome-driver\chromedriver.exe') driver = self.driver driver.get('https://the-internet.herokuapp.com/') driver.find_element(By.LINK_TEXT, 'Disappearing Elements').click() def test_name_elements(self): count = 1 driver = self.driver for i in range(1000): try: driver.find_element(By.LINK_TEXT, 'Gallery').click() time.sleep(2) break except: driver.refresh() count += 1 time.sleep(2) print(count) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)