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 min
  • 2
    Historia de Selenium

    Historia de Selenium

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

    Otras herramientas de testing y automatización

    03:40 min

Preparar entorno de trabajo

  • 4
    Configurar entorno de trabajo

    Configurar entorno de trabajo

    01:43 min
  • 5

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

    01:44 min
  • 6
    ¡Hola, mundo!

    ¡Hola, mundo!

    11:51 min

Utilizar comandos básicos

  • 7
    Encontrar elementos con find_element

    Encontrar elementos con find_element

    15:23 min
  • 8
    Preparar assertions y test suites

    Preparar assertions y test suites

    13:50 min
  • 9

    Entender las clases WebDriver y WebElement

    01:18 min

Interactuar con elementos

  • 10
    Manejar form, textbox, checkbox y radio button

    Manejar form, textbox, checkbox y radio button

    13:37 min
  • 11
    Manejar dropdown y listas

    Manejar dropdown y listas

    07:42 min
  • 12
    Manejar alert y pop-up

    Manejar alert y pop-up

    06:05 min
  • 13
    Automatizar navegación

    Automatizar navegación

    03:54 min

Sincronizar pruebas

  • 14
    Demora implícita y explícita

    Demora implícita y explícita

    08:38 min
  • 15

    Condicionales esperadas

    00:44 min

Retos

  • 16
    Agregar y eliminar elementos

    Agregar y eliminar elementos

    09:16 min
  • 17
    Elementos dinámicos

    Elementos dinámicos

    06:46 min
  • 18
    Controles dinámicos

    Controles dinámicos

    08:01 min
  • 19
    Typos

    Typos

    05:43 min
  • 20
    Ordenar tablas

    Ordenar tablas

    07:12 min

Metodologías de Trabajo

  • 21
    Data Driven Testing (DDT)

    Data Driven Testing (DDT)

    13:35 min
  • 22
    Page Object Model (POM)

    Page Object Model (POM)

    10:35 min

Cierre del curso

  • 23
    Realizar una prueba técnica

    Realizar una prueba técnica

    Viendo ahora
  • 24
    Conclusiones

    Conclusiones

    01:43 min
  • Tomar el examen del curso
    • 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