CursosEmpresasBlogLiveConfPrecios

Realizar una prueba técnica

Clase 23 de 24 • Curso de Introducción a Selenium con Python

Clase anteriorSiguiente clase

Contenido del curso

Conocer el ecosistema de Selenium
  • 1
    Por qué aprender Selenium y qué verás

    Por qué aprender Selenium y qué verás

    03:15
  • 2
    Historia de Selenium

    Historia de Selenium

    09:05
  • 3
    Otras herramientas de testing y automatización

    Otras herramientas de testing y automatización

    03:40
Preparar entorno de trabajo
  • 4
    Configurar entorno de trabajo

    Configurar entorno de trabajo

    01:43
  • 5

    Compatibilidad con Python 3.9 y aprendiendo a utilizar múltiples versiones

    01:44
  • 6
    ¡Hola, mundo!

    ¡Hola, mundo!

    11:51
Utilizar comandos básicos
  • 7
    Encontrar elementos con find_element

    Encontrar elementos con find_element

    15:23
  • 8
    Preparar assertions y test suites

    Preparar assertions y test suites

    13:50
  • 9

    Entender las clases WebDriver y WebElement

    01:18
Interactuar con elementos
  • 10
    Manejar form, textbox, checkbox y radio button

    Manejar form, textbox, checkbox y radio button

    13:37
  • 11
    Manejar dropdown y listas

    Manejar dropdown y listas

    07:42
  • 12
    Manejar alert y pop-up

    Manejar alert y pop-up

    06:05
  • 13
    Automatizar navegación

    Automatizar navegación

    03:54
Sincronizar pruebas
  • 14
    Demora implícita y explícita

    Demora implícita y explícita

    08:38
  • 15

    Condicionales esperadas

    00:44
Retos
  • 16
    Agregar y eliminar elementos

    Agregar y eliminar elementos

    09:16
  • 17
    Elementos dinámicos

    Elementos dinámicos

    06:46
  • 18
    Controles dinámicos

    Controles dinámicos

    08:01
  • 19
    Typos

    Typos

    05:43
  • 20
    Ordenar tablas

    Ordenar tablas

    07:12
Metodologías de Trabajo
  • 21
    Data Driven Testing (DDT)

    Data Driven Testing (DDT)

    13:35
  • 22
    Page Object Model (POM)

    Page Object Model (POM)

    10:35
Cierre del curso
  • 23
    Realizar una prueba técnica

    Realizar una prueba técnica

    11:33
  • 24
    Conclusiones

    Conclusiones

    01:43
    Arnaldo Martinez

    Arnaldo Martinez

    student•
    hace 5 años

    Para utilizar location, condition y higher_price cambie el código. El mensaje de Selenium fue "Element click intercepted".

    # Anterior location.click() # Nuevo driver.execute_script("arguments[0].click();", location)

    Con eso logre realizar el test.

      Jonathan Mardones Guzmán

      Jonathan Mardones Guzmán

      student•
      hace 5 años

      Tuve el mismo problema, y me sirvió tu solución. ¡Muchas gracias!

      Santiago Herrera Velásquez

      Santiago Herrera Velásquez

      student•
      hace 5 años

      Me paso lo mismo, que raro GRACIAS!

    Sebastian Granda Gallego

    Sebastian Granda Gallego

    student•
    hace 5 años

    Este es mi implementación antes de ver el vídeo, mi intención era generalizarlo lo mas posible para cualquier variación como país, búsqueda, filtro, localidad y orden.

    mercado_libre_page.py

    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 MercadoLibrePage(object): def __init__(self, driver): self._driver = driver self._url = 'http://mercadolibre.com/' @property def is_loaded(self): WebDriverWait(self._driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'ml-site-list')) or EC.presence_of_element_located((By.NAME, 'as_word')) ) return True @property def keyword(self): input_field = self._driver.find_element_by_name('as_word') return input_field.get_attribute('value') def open(self): self._driver.get(self._url) def type_search(self, keyword): input_field = self._driver.find_element_by_name('as_word') input_field.send_keys(keyword) def click_submit(self): input_field = self._driver.find_element_by_name('as_word') input_field.submit() def search(self, keyword): self.type_search(keyword) self.click_submit() def order_data(self, elements): obj = {} for element in elements: obj[element.text.lower()] = element return obj def get_contries(self): contries = self._driver.find_elements_by_class_name('ml-site-link') return self.order_data(contries) def choise_contry(self, contry): contry_item = self.get_contries()[contry.lower()] contry_item.click() def get_filters(self): filters = WebDriverWait(self._driver, 10).until(EC.visibility_of_any_elements_located((By.CLASS_NAME, 'ui-search-filter-name'))) return self.order_data(filters) def choise_filter(self, keyword): self.get_filters()[keyword.lower()].click() def get_orders(self): list_buttom = WebDriverWait(self._driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'andes-dropdown__trigger'))) list_buttom.click() orders = self._driver.find_elements_by_class_name('andes-list__item-primary') return self.order_data(orders) def choise_order_by(self, keyword): self.get_orders()[keyword.lower()].click() def get_top_5_elements_result(self): WebDriverWait(self._driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'ui-search-layout__item'))) data = [[None, None]] * 5 for i in range(5): data[i][0] = self._driver.find_element_by_xpath(f'//*[@id="root-app"]/div/div/section/ol/li[{i+1}]/div/div/div[2]/div[1]/a/h2').text data[i][1] = self._driver.find_element_by_xpath(f'//*[@id="root-app"]/div/div/section/ol/li[{i+1}]/div/div/div[2]/div[2]/div/div/span[1]/span[2]').text return data

    test_mercado_libre.py

    import unittest from selenium import webdriver from mercado_libre_page import MercadoLibrePage class CompareProducts(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome(executable_path = r'./chromedriver.exe') cls.driver.maximize_window() def test_mercado_libre(self): mcl = MercadoLibrePage(self.driver) mcl.open() self.assertTrue(mcl.is_loaded) mcl.choise_contry('colombia') mcl.search('playstation 4') mcl.choise_filter('nuevo') mcl.choise_filter('Bogotá D.C.') mcl.choise_order_by('Mayor precio') print(mcl.get_top_5_elements_result()) @classmethod def tearDownClass(cls): cls.driver.close() if __name__ == "__main__": unittest.main(verbosity=2)
      Fredy Mendoza Vargas

      Fredy Mendoza Vargas

      student•
      hace 5 años

      Muchas gracias!

      Andres Felipe Barrera Pulido

      Andres Felipe Barrera Pulido

      student•
      hace 5 años

      Uffff vacanismo gracias!!!

    Sandra Milena Rojas Herrán

    Sandra Milena Rojas Herrán

    student•
    hace 4 años

    Mucho cuidado con el botón de cookies. Como bien es sabido, el chromedriver ejecuta en incógnito. Cuando tú estás revisando mucho ++ojo++, porque cuando exploras, lo haces hasta con tu cuenta ya ingresada, y claro, con las cookies ya guardadas. Pero es muy diferente, cuando ingresas en incógnito, porque allí te pide que o aceptes o rechaces las cookies, por ser la "primera vez" que ingresas.

    Para ello, debes poner este código dentro del ejercicio de la clase:

    Después de buscar el playstation y antes de hacer el filtro de ubicación:

    cookies_in = driver.find_element_by_xpath("/html/body/div[2]/div[1]/div[2]/button[1]") cookies_in.click() sleep(3)

    Y eso es todo, te funcionará perfecto.

    ++Consejo: ++ Al hacer un script de automatización y que vayas haciendo la exploración de la página web, realiza la exploración en incógnito, pues así garantizas el comportamiento normal que se tendría con el chromedriver, que es una especie de incógnito.

    Espero les sirva...

      Adrian Garcia

      Adrian Garcia

      student•
      hace 3 años

      en mi caso lo use antes de buscar playstation despues no me funciona

    Orazio Cappadonna Cantor

    Orazio Cappadonna Cantor

    student•
    hace 5 años

    Marzo-2021. Sale este error: Message: Element <span class="ui-search-filter-name"> is not clickable at point (113,643) because another element <div id="cookieDisclaimerBanner" class="nav-cookie-disclaimer"> obscures it. Parece que usaron alguna cookie para bloquear busquedas automatizadas con Selenium (por ejemplo), F. De todas maneras gran curso

      Jason Mateo Pineda Lopera

      Jason Mateo Pineda Lopera

      student•
      hace 5 años

      No es problema, debes usar la solucion mencionada en los anteriores post:

      location=driver.find_element_by_partial_link_text('Bogotá D.C.') driver.execute_script("arguments[0].click();", location)
      <code>
      <code>
      Jason Mateo Pineda Lopera

      Jason Mateo Pineda Lopera

      student•
      hace 5 años

      En caso de dudas te dejo el código a hoy 30 de marzo 2021 100% funcional

      import unittest from selenium import webdriver from time import sleep class Typos(unittest.TestCase): def setUp(self): self.driver=webdriver.Chrome(executable_path = './chromedriver_win32/chromedriver.exe') driver=self.driver driver.maximize_window() driver.get('https://www.mercadolibre.com') def test_search_ps4(self): driver=self.driver country=driver.find_element_by_id('CO') country.click() sleep(3) search_field=driver.find_element_by_name('as_word') search_field.click() search_field.clear() search_field.send_keys('playstation 4') search_field.submit() sleep(3) location=driver.find_element_by_partial_link_text('Bogotá D.C.') driver.execute_script("arguments[0].click();", location) sleep(3) condition=driver.find_element_by_partial_link_text('Nuevo') driver.execute_script("arguments[0].click();", condition) sleep(3) order_menu=driver.find_element_by_css_selector('#root-app > div > div > section > div.ui-search-view-options__container > div > div > div.ui-search-view-options__group > div.ui-search-sort-filter > div > div > button') order_menu.click() value=driver.find_element_by_partial_link_text('Mayor precio') driver.execute_script("arguments[0].click();", value) sleep(3) articles=[] prices=[] for i in range(5): article_name=driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i+1}]/div/div/div[2]/div[1]/a/h2').text articles.append(article_name) article_price=driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i+1}]/div/div/div[2]/div[2]/div[1]/div[1]/div/div/span[1]/span[2]').text prices.append(article_price) print(articles, prices) def tearDown(self): self.driver.close() if __name__=="__main__": unittest.main(verbosity=2)
    Sebastián Andrade

    Sebastián Andrade

    student•
    hace 5 años

    Si es legal Automatizar mercadolibre? solo por las dudas xd

      Korpi delfin

      Korpi delfin

      student•
      hace 5 años

      Es legal :D

      https://mercadolibre.com/robots.txt

      Sebastián Andrade

      Sebastián Andrade

      student•
      hace 5 años

      Gracias, es que no habia entendido el archivo

    Ignacio Solís Aguiluz

    Ignacio Solís Aguiluz

    student•
    hace 5 años

    Este es mi códgio por si le sirve a alguien. Luego de unos arreglos que no me funcionaban algunos clicks y encontre la solución en los comentarios.

    import unittest from selenium import webdriver from time import sleep class TestingMercadoLibre(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'./chromedriver.exe') driver = self.driver driver.maximize_window() driver.get('https://www.mercadolibre.com') def test_search_PS4(self): driver = self.driver country = driver.find_element_by_id("CO") country.click() search_field = driver.find_element_by_name("as_word") search_field.click() search_field.clear() search_field.send_keys('playstation 4') search_field.submit() sleep(3) location = driver.find_element_by_xpath("//div/div/aside/section[2]/dl[9]/dd[1]/a") driver.execute_script("arguments[0].click();", location) sleep(3) condition = driver.find_element_by_xpath("//div/div/aside/section[3]/dl[6]/dd[1]/a") driver.execute_script("arguments[0].click();", condition) sleep(3) order_menu = driver.find_element_by_class_name("andes-dropdown__trigger") order_menu.click() higher_price = driver.find_element_by_xpath("//div/div/aside/section[2]/div[2]/div[1]/div/div/div/ul/li[3]/a") driver.execute_script("arguments[0].click();", higher_price) sleep(3) articles = [] prices = [] for i in range(5): article_name = driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i + 1}]/div/div/div[2]/div[1]/a').text articles.append(article_name) article_price = driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i + 1}]/div/div/div[2]/div[2]/div[1]/div[1]/div/div/span[1]/span[2]').text prices.append(article_price) print(articles, prices) def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()
    DAVID EDUARDO BAEZ SANCHEZ

    DAVID EDUARDO BAEZ SANCHEZ

    student•
    hace 5 años

    Me toco modificar algunos click

    import unittest from selenium import webdriver from api_data_mock import ApiDataMock from selenium.webdriver.support.ui import Select # Modulo para poder seleccionar del dropdown from time import sleep from selenium.webdriver.common.by import By #Hacer referencia a un elemento del sitio web, para interactuar from selenium.webdriver.support.ui import WebDriverWait # Modulo para manejo de esperas explicitas from selenium.webdriver.support import expected_conditions as EC #esperas explicitas class TestingMercadoLibre(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'./chromedriver.exe') driver = self.driver driver.maximize_window() driver.get('**********') # adiconar la pagina def test_search_xbox(self): driver = self.driver country = driver.find_element_by_id('CO') country.click() sleep(2) search_field = driver.find_element_by_name('as_word') search_field.clear() search_field.send_keys('xbox') search_field.submit() sleep(2) location = driver.find_element_by_xpath('/html/body/main/div/div/aside/section[2]/dl[8]/dd[1]/a/span[1]') driver.execute_script("arguments[0].click();", location) # location.click() sleep(2) condition = driver.find_element_by_partial_link_text('Nuevo') driver.execute_script("arguments[0].click();", condition) # condition.click() sleep(2) order_menu = driver.find_element_by_class_name('andes-dropdown__trigger') order_menu.click() higher_price = driver.find_element_by_css_selector('li.andes-list__item:nth-child(3) > div:nth-child(1) > div:nth-child(1) > a:nth-child(1)') higher_price.click() sleep(2) articles = [] prices = [] for i in range(5): article_name = driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i + 1}]/div/div/div[2]/div[1]/a/h2').text price_article = driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i + 1}]/div/div/div[2]/div[2]/div/div/span[1]/span[2]').text articles.append(article_name) prices.append(price_article) print(articles,prices) def tearDown(self): self.driver.implicitly_wait(5) self.driver.close() if __name__ == '__main__': unittest.main(verbosity=2)
    Royer Guerrero Pinilla

    Royer Guerrero Pinilla

    student•
    hace 5 años

    Creo que es mejor usar un diccionario en vez de dos listas

    products = {} for i in range(5): article_name = driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i + 1}]/div/div[2]/div/h2/a/span').text price = driver.find_element_by_xpath(f'/html/body/main/div/div/section/ol/li[{i + 1}]/div/div[2]/div/div[1]/div/span[2]').text products[article_name] = price
      Héctor Daniel Vega Quiñones

      Héctor Daniel Vega Quiñones

      teacher•
      hace 5 años

      Totalmente. La idea de estos retos es que también vean cómo pueden optimizar su código ;)

      Santiago Herrera Velásquez

      Santiago Herrera Velásquez

      student•
      hace 5 años

      QUE BIEN! yo lo hice con tuplas y va perfecto tambien

      for i in range(Q_ARTICLES): title = driver.find_element_by_xpath(f'//*[@id="root-app"]/div/div/section/ol/li[{i + 1}]/div/div/div[2]/div[1]/a/h2') price = driver.find_element_by_xpath(f'//*[@id="root-app"]/div/div/section/ol/li[{i + 1}]/div/div/div[2]/div[2]/div[1]/div[1]/div/div/span[1]') product = (title.text, price.text) products.append(product) print(products)```
    Hugo Gomez Tinoco

    Hugo Gomez Tinoco

    student•
    hace 4 años

    Con la ayuda de los comentarios y unas modificaciones más porque el sitio cambia constantemente aquí el código funcional para la fecha 09-10-2021

    import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from time import sleep class MercadoLibre(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome(executable_path='/usr/bin/chromedriver') driver = cls.driver driver.get('https://www.mercadolibre.com/') driver.maximize_window() def test_search_ps4(self): driver = self.driver choose_country = driver.find_element_by_id('CO') choose_country.click() search_bar = driver.find_element_by_class_name('nav-search-input') search_bar.click() search_bar.clear() search_bar.send_keys('playstation 4') search_bar.submit() driver.implicitly_wait(3) pick_news = driver.find_element_by_partial_link_text('Nuevo') driver.execute_script("arguments[0].click();", pick_news) driver.implicitly_wait(3) pick_location = driver.find_element_by_partial_link_text('Bogotá D.C.') driver.execute_script("arguments[0].click();", pick_location) driver.implicitly_wait(3) pick = driver.find_element_by_class_name('andes-dropdown__trigger') driver.execute_script("arguments[0].click();", pick) driver.implicitly_wait(10) pick_expensive_price = driver.find_elements_by_class_name('andes-list__item-primary') pick_expensive_price[2].click() articles = [] prices = [] for i in range(5): article_name = driver.find_element_by_css_selector(f'#root-app > div > div > section > ol > li:nth-child({i+1}) > div > div > div.ui-search-result__content-wrapper > div.ui-search-item__group.ui-search-item__group--title > a > h2').text articles.append(article_name) article_price = driver.find_element_by_css_selector(f'#root-app > div > div > section > ol > li:nth-child({i+1}) > div > div > div.ui-search-result__content-wrapper > div.ui-search-result__content-columns > div.ui-search-result__content-column.ui-search-result__content-column--left > div.ui-search-item__group.ui-search-item__group--price > a > div > div > span.price-tag.ui-search-price__part > span.price-tag-amount > span.price-tag-fraction').text prices.append(article_price) for x in range(len(articles)): print(prices[x]+' -> '+articles[x]) @classmethod def tearDownClass(cls): cls.driver.close() if __name__ == '__main__': unittest.main(verbosity=2, testRunner=HTMLTestRunner(output = 'reportes', report_name = 'ML_report'))
      Ismael Danilo Herrera Sánchez

      Ismael Danilo Herrera Sánchez

      student•
      hace 4 años

      Gracias de nuevo Hugo 😅 Incluso volvió a cambiar.

    Christian Leonardo Hernandez Estrada

    Christian Leonardo Hernandez Estrada

    student•
    hace 5 años

    Esta es mi implementacion

    test_mercadolibre:

    from selenium import webdriver import unittest from mercadolibre_page import MercadoLibrePage from time import sleep class testMercadoLibre(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome(executable_path=r'C:/chromedriver.exe') cls.driver.maximize_window() def test_search(self): mercadolibre = MercadoLibrePage(self.driver) mercadolibre.open() mercadolibre.select_country('Colombia') self.assertEqual(mercadolibre.current_url, 'https://www.mercadolibre.com.co/#from=homecom') mercadolibre.type_search('playstation 4') mercadolibre.click_submit() self.assertEqual('playstation 4', mercadolibre.keyword) mercadolibre.acept_cookies() mercadolibre.add_filter('Nuevo') self.assertEqual(mercadolibre.last_filter, 'Nuevo') mercadolibre.add_filter('Bogotá D.C.') self.assertEqual(mercadolibre.last_filter, 'Bogotá D.C.') mercadolibre.open_price_filter_window() mercadolibre.add_price_filter('Menor precio') self.assertEqual(mercadolibre.current_order, 'Menor precio') mercadolibre.get_information(60) @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)

    mercadolibre_page:

    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 selenium.common.exceptions import NoSuchElementException import csv import time class MercadoLibrePage(object): def __init__(self, driver): self._driver = driver self._url = 'https://www.mercadolibre.com' self._search_locator = 'as_word' self._price_filter_locator = '//div[@class="andes-widther"]//button[@class="andes-dropdown__trigger"]' self._filters = [] @property def is_loaded(self): WebDriverWait(self._driver, 10).until(EC.presence_of_element_located((By.NAME, self._search_locator))) return True @property def keyword(self): search_field = self._driver.find_element_by_name(self._search_locator) return search_field.get_attribute('value') @property def current_url(self): return self._driver.current_url @property def last_filter(self): return self._filters[len(self._filters)-1 ] @property def current_order(self): return WebDriverWait(self._driver, 10).until(EC.element_to_be_clickable((By.XPATH, self._price_filter_locator))).text def open(self): self._driver.get(self._url) def acept_cookies(self): try: location_window = self._driver.find_element_by_xpath('//div[@class="onboarding-cp"]') location_window.find_element_by_class_name('andes-tooltip-button-close').click() except NoSuchElementException: pass try: self._driver.find_element_by_id('cookieDisclaimerButton').click() except: pass def select_country(self, country): self._driver.find_element_by_link_text(country).click() def type_search(self, keyword): search_field = WebDriverWait(self._driver, 10).until(EC.presence_of_element_located((By.NAME, self._search_locator))) search_field.send_keys(keyword) def click_submit(self): search_field = self._driver.find_element_by_name(self._search_locator) search_field.submit() def add_filter(self, filter_keyword): WebDriverWait(self._driver, 10).until(EC.element_to_be_clickable((By.XPATH, f'//section[@class="ui-search-filter-groups"]//span[text()="{filter_keyword}"]'))).click() self._filters.append(filter_keyword) def open_price_filter_window(self): WebDriverWait(self._driver, 10).until(EC.element_to_be_clickable((By.XPATH, self._price_filter_locator))).click() #the option filter are: [Más relevantes, Menor precio, Mayor precio] def add_price_filter(self, filter_keyword): self._driver.find_element_by_xpath(f'//ul[@class="andes-list andes-list--size-compact andes-list--dropdown andes-list--selectable"]//div[text()="{filter_keyword}"]').click() def get_information(self, product_quantity): #get information of all products that you need products = self._driver.find_elements_by_class_name('ui-search-layout__item') data = [[] for i in range(0, 2)] print() if products: n_products = 0 i = 0 while True: try: name = products[i].find_element_by_class_name('ui-search-item__title') price = products[i].find_element_by_class_name('price-tag-fraction') data[0].append(name.text) data[1].append(price.text) print(f'name: {name.text} \nprice: {price.text}\n') i += 1 n_products += 1 if n_products == product_quantity: print(f'Se han encontraron los {n_products} productos.\n') break except IndexError: i = 0 try: self._driver.find_element_by_xpath('//div[@class="ui-search-pagination"]//li//span[text()="Siguiente"]').click() self._driver.implicitly_wait(10) products = self._driver.find_elements_by_class_name('ui-search-layout__item') except NoSuchElementException: print(f'Solo se encontraron {n_products} productos.\n') break self._save_data(data) else: print('\nNo se encontraron productos\n') def _save_data(self, data): #save data on csv file date = time.strftime('%d_%m_%Y', time.localtime()) filename = f'products_data_{date}.csv' headers = ['name', 'price'] with open(filename, mode= 'w+', encoding='utf-8', ) as f: writer = csv.writer(f) writer.writerow(headers) for i in range(0, len(data[0])): row = [data[0][i], data[1][i]] writer.writerow(row)
    Junior Erny Aguayo Cuadros

    Junior Erny Aguayo Cuadros

    student•
    hace 5 años

    El class_name de la variable Order_menu hoy 26 julio es andes-dropdown__trigger y no ui-dropdown__link buen curso

      Héctor Daniel Vega Quiñones

      Héctor Daniel Vega Quiñones

      teacher•
      hace 5 años

      Buena observación, recordemos que hay sitios que pueden cambiar constantemente.

    Steven Moreno

    Steven Moreno

    student•
    hace 5 años

    Un selector de css más corto li.ui-list__item:nth-child(3) > a:nth-child(1) para la variable higher_price

      Héctor Daniel Vega Quiñones

      Héctor Daniel Vega Quiñones

      teacher•
      hace 5 años

      Excelente alternativa, asi obtienes un código más prolijo ;)

    José Manuel Piña Rodríguez

    José Manuel Piña Rodríguez

    student•
    hace 5 años

    Excelente profe, aplicar todo y muy util ejemplo.

    Jesús Alfredo González Monroy

    Jesús Alfredo González Monroy

    student•
    hace 4 años

    Al terminar una prueba no quiero que el navegador se cierre como puedo hacer esto??

      Hugo Gomez Tinoco

      Hugo Gomez Tinoco

      student•
      hace 4 años

      Al final de la prueba pon sleep(60) y te dará un minuto para que puedas comprobar que todo se aplicó correctamente Para agregar sleep solo importas el módulo time

      from time import sleep
    Juan Sebastían Del Mar Aragon Rios

    Juan Sebastían Del Mar Aragon Rios

    student•
    hace 3 años

    tengo entendido que el metodo "find_element_by" fue eliminado en selenium desde la version 4.3. Es posible trabajar hoy en dia con este curso?

      Alberto Fleitas

      Alberto Fleitas

      student•
      hace 3 años

      Es totalmente posible solo debes cambiar tu código donde sea necesario, eso si, vas a tener que ir solucionando errores debido a la actualización, en esa función en específico te dejo la documentación: Link

    Esteban parra

    Esteban parra

    student•
    hace 5 años

    es posible pasar el check de el recaptcha V2 y V3 de google usando selenium??

      Israel Yance

      Israel Yance

      student•
      hace 5 años

      Algo que podría revisarse y quizás ayude https://medium.com/analytics-vidhya/how-to-easily-bypass-recaptchav2-with-selenium-7f7a9a44fa9e https://stackoverflow.com/questions/55501524/how-does-recaptcha-3-know-im-using-selenium-chromedriver

      Héctor Daniel Vega Quiñones

      Héctor Daniel Vega Quiñones

      teacher•
      hace 5 años

      Es posible, pero no lo hagas a no ser que sea en tus peopios peoyectos 😉

    Sebastián Andrés Sanhueza Tapia

    Sebastián Andrés Sanhueza Tapia

    student•
    hace 2 años

    El Xpath que menciona el profe, no me sirvió dado que cambia un poco la estructura de la lista de producto en la web de mercado libre, para eso hice un xpath más flexible, que captura los productos a pesar de los cambios en cada recarga

    for i in range(8): article_name = driver.find_element(By.XPATH, f'//li[{i + 1}]//h2').text articles.append(article_name) article_price = driver.find_element(By.XPATH, f'//li[{i + 1}]//span[contains(@class, "andes-money-amount__fraction")]').text prices.append(article_price) for i in range(8): print(articles[i], "| Precio:", prices[i])
    Jose Luis

    Jose Luis

    student•
    hace 3 años

    Así lo hice yo

    from itertools import product import unittest from selenium import webdriver from time import sleep class PruebaTecnica(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path=r'E:\Descargas\chromedriver.exe') driver = self.driver driver.implicitly_wait(50) driver.maximize_window() #driver.get('https://www.mercadolibre.com') driver.get('https://www.google.com') def test_mercado_libre(self): input_field = self.driver.find_element_by_name('q') search_page = 'Mercado libre' input_field.send_keys(search_page) input_field.submit() find_option = self.driver.find_element_by_partial_link_text('Mercado Libre Colombia - Envíos Gratis en el día') find_option.click() #country = self.driver.find_element_by_id('CO') #country.click() #search_product = self.driver.find_element_by_class_name('nav-search-input') search_product = self.driver.find_element_by_name('as_word') name_product = 'Playstation 4' search_product.send_keys(name_product) search_product.submit() #condition = self.driver.find_element_by_css_selector('#root-app > div > div.ui-search-main.ui-search-main--exhibitor.ui-search-main--only-products > aside > section > div:nth-child(3) > ul > li:nth-child(1) > a > span.ui-search-filter-name') state_product = self.driver.find_element_by_partial_link_text('Nuevo') state_product.click() sleep(5) #city = self.driver.find_element_by_link_text('#root-app > div > div.ui-search-main.ui-search-main--exhibitor.ui-search-main--only-products > aside > section.ui-search-filter-groups > div:nth-child(3) > ul > li:nth-child(1) > a > span.ui-search-filter-name') city = self.driver.find_element_by_partial_link_text('Bogotá D.C.') city.click() sleep(5) order_menu = self.driver.find_element_by_class_name('andes-dropdown__display-values') order_menu.click() sleep(5) order_price = self.driver.find_element_by_css_selector('#andes-dropdown-más-relevantes-list-option-price_desc > div > div > span') order_price.click() sleep(5) #name_article = self.driver.find_element_by_class_name('ui-search-item__title') #name_article.click() #vamos a colocar los productos dentro de una lista articles = [] prices = [] for i in range(5): article_name = self.driver.find_element_by_xpath(f'//*[@id="root-app"]/div/div[2]/section/ol/li[{i+1}]/div/div/div[2]/div[1]/a/h2').text articles.append(article_name) article_price = self.driver.find_element_by_xpath(f'//*[@id="root-app"]/div/div[2]/section/ol/li[{i+1}]/div/div/div[2]/div[2]/div[1]/div[1]/div/div/div/span[1]/span[2]/span[2]').text prices.append(article_price) print(articles, prices) def tearDown(self): self.driver.close() if __name__ == '__main__': unittest.main(verbosity=2)
    Francisco Peñalo Feliz

    Francisco Peñalo Feliz

    student•
    hace 3 años

    Realice la recolección de todos los datos mendiante CSS_SELECTOR y converti la data en un diccionario con los artículos y sus precios.

    def test_search_ps4(self): driver = self.driver country = driver.find_element(By.ID, 'CO') country.click() accept_cookie_button = driver.find_element( By.XPATH, '/html/body/div[2]/div[1]/div[2]/button[1]') accept_cookie_button.click() sleep(2) search_input = driver.find_element(By.NAME, 'as_word') search_input.click() search_input.clear() search_input.send_keys('playstation 4') search_input.submit() sleep(2) location = driver.find_element(By.PARTIAL_LINK_TEXT, 'Bogotá D.C.') location.click() sleep(2) condition = driver.find_element(By.PARTIAL_LINK_TEXT, 'Nuevo') condition.click() sleep(2) order_menu = driver.find_element( By.CLASS_NAME, 'andes-dropdown__trigger') order_menu.click() higher_price = driver.find_element( By.CSS_SELECTOR, '#andes-dropdown-más-relevantes-list-option-price_desc') higher_price.click() article_elements = driver.find_elements( By.CSS_SELECTOR, 'div.ui-search-result__content-wrapper h2.ui-search-item__title') price_elements = driver.find_elements( By.CSS_SELECTOR, 'div.ui-search-result__content-wrapper div.ui-search-price--size-medium div.ui-search-price__second-line span.price-tag-fraction') item_count = len(article_elements) data = [{'article': article_elements[i].text, 'price': price_elements[i].text} for i in range(item_count)] print(f'\nFound {item_count} items.') print('\nData: ', data)
    Christian Andrés Espinosa Villagómez

    Christian Andrés Espinosa Villagómez

    student•
    hace 3 años

    Es el segundo curso que veo de Hector Vega , y la verdad hay temas que quedan claros por que son sencillos , pero no porque explique bien , ; en general el no explica nada bien ,solo hace y hace código , da ganas de dormirse antes que ver el curso , no se sabe incluso ni que va hacer , pesimo curso. sobre 10 , le doy un 6/10

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads