Que buen profesor. Mis respetos. Su forma de explicar es muy clara. Lo mejor es que usa variables y todo en ingles. <3
0:00/6:46
Que buen profesor. Mis respetos. Su forma de explicar es muy clara. Lo mejor es que usa variables y todo en ingles. <3
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}')```
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, creo que 'tries += 1'. Va dentro del bloque de ‘try’ en vez de ‘except’
Alejandro Andrade Soriano
Que buen profesor. Mis respetos. Su forma de explicar es muy clara. Lo mejor es que usa variables y todo en ingles. <3
Héctor Daniel Vega Quiñones
ProfesorMuchas gracias por tus comentarios, Alejandro. Espero que estés disfrutando del curso :)
HERNAN DARIO VELASQUEZ ORTIZ
Y no solo eso, también se toma el tiempo de leer los comentarios y responder, son muy pocos los que hacen eso.
Carlos Andres Ocampo Pabon
Mario Barbosa
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}")
Mitchell Mirano
Yo conoci selenium caundo estaba haciendo Web Scraping de paginas dinamicas...pero no imagine que tenia todo este potencial.
Sebastian Granda Gallego
Antoine J. Manuel Gutierrez.
esta buena bro
Fredy Mendoza Vargas
Gracias viejo!
Royer Guerrero Pinilla
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")```
Andres Gonzalez
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
Usuario anónimo
UserGeorgina Paulina Cuadriello Ramírez
Podrían subir los archivos de los ejemplos como en los otros cursos? Please
Héctor Daniel Vega Quiñones
ProfesorHola, acá puedes encontrar el repositorio con los archivos del curso :D https://github.com/terranigmark/curso-selenium-platzi
Steven Moreno
Hola, creo que 'tries += 1'. Va dentro del bloque de ‘try’ en vez de ‘except’
Alberto Perdomo
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.
Steven Moreno
Tambien cambie el inicializador a '0' envitando precisamente esto :)
Yoshie Garcés Rodríguez
Mario Alexander Vargas Celis
daniel saltarin castillo
¿es posible descargar algún archivo de manera automatica con selenium?
Luis Lira
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
Miguel Angel Reyes Moreno
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')
Bruno Guillaume Hernández Villamil
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()
Jhonatan David Ibarra Lavado
woooo, selnium y su magia jajaja
Antonio Demarco Bonino
A seguir sumando experiencia.
José Manuel Piña Rodríguez
Excelente profe, al principio fue muy abrumador todo , pero ahora esta mas claro todo.
Héctor Daniel Vega Quiñones
ProfesorPor eso es que nunca debes para de aprender ;) Cuando creemos saber un lenguaje siempre aparecerá alguna tecnología para dominar y practicar.
Enrique Uzcategui
¿Cuál es la diferencia entre copiar el Xpath y el full Xpath? En qué caso debería usar uno o el otro?
Héctor Daniel Vega Quiñones
ProfesorEligiendo 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.
Sebastián Andrade
Sebastián Andrade
en una de las veces que corri el script tuvo que refrescar 6 veces xd
Emilio Ciappi
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)
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}')```
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
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"))
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)
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)