CursosEmpresasBlogLiveConfPrecios

Testing de Funcionalidades en Tiendas en Línea

Clase 8 de 17 • Curso de Automatización de Test con Playwright

Contenido del curso

Fundamentos

  • 1
    Automatización de Pruebas con Playwright: Curso Completo

    Automatización de Pruebas con Playwright: Curso Completo

    05:04 min
  • 2
    Instalación de Playwright en Visual Studio Code

    Instalación de Playwright en Visual Studio Code

    04:08 min
  • 3
    Creación de Tests Automatizados con Playwright en Visual Studio Code

    Creación de Tests Automatizados con Playwright en Visual Studio Code

    05:23 min
  • 4
    Ejecución de Tests con Playwright: Métodos y Configuración

    Ejecución de Tests con Playwright: Métodos y Configuración

    14:35 min

Estructura de un test

  • 5
    Locators y Selectors en Playwright: Uso y Corrección de Errores

    Locators y Selectors en Playwright: Uso y Corrección de Errores

    18:32 min
  • 6
    Uso de Selectores en Tests de UI con Playwright

    Uso de Selectores en Tests de UI con Playwright

    11:24 min
  • 7
    Assertions y Validaciones en Tests con Visual Studio Code

    Assertions y Validaciones en Tests con Visual Studio Code

    13:47 min

Reto #1

  • 8

    Testing de Funcionalidades en Tiendas en Línea

    Viendo ahora
  • 9
    Automatización de Compras en Tienda Online con Playwright

    Automatización de Compras en Tienda Online con Playwright

    28:43 min

Debug de un test

  • 10
    Depuración de Tests con Playwright Inspector

    Depuración de Tests con Playwright Inspector

    10:27 min
  • 11
    Uso de DevTools y Playwright para Selección Efectiva de Elementos

    Uso de DevTools y Playwright para Selección Efectiva de Elementos

    08:18 min
  • 12
    Habilitación de Debugging API Locks en Visual Studio Code

    Habilitación de Debugging API Locks en Visual Studio Code

    04:23 min
  • 13
    Uso de Playwright Tracing para Debugging de Tests

    Uso de Playwright Tracing para Debugging de Tests

    10:42 min

Reto #2

  • 14
    Reparación de Tests en Playwright: Reto Final en GitHub

    Reparación de Tests en Playwright: Reto Final en GitHub

    02:06 min
  • 15
    Resolución de Errores en Tests de Playwright

    Resolución de Errores en Tests de Playwright

    15:38 min
  • 16
    Corrección de Tests con Playwright y Visual Studio Code

    Corrección de Tests con Playwright y Visual Studio Code

    09:10 min

Recomendaciones finales

  • 17
    Recomendaciones finales para pruebas efectivas con PlayWrite

    Recomendaciones finales para pruebas efectivas con PlayWrite

    03:30 min
Tomar examen

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

      Hola, llegó el momento de enfrentar tu primer reto. Pero antes un ⚠️ ANUNCIO IMPORTANTE ⚠️

      Desafortunadamente, el sitio web con el que resolveré el reto en la siguiente clase no está disponible por el momento. Pero no te preocupes, la consigna es “nunca pares de aprender”, así que te dejo esta web para que realices tus test: https://automationexercise.com/category_products

      ¿Qué diferencias vas a encontrar respecto a la forma yo resolveré el reto en la siguiente clase?

      • Al hacer hover sobre un artículo a comprar no te aparecerá "quick view", en vez de eso deberás dar click directamente en "view product".
      • Una vez ahí, la cantidad de productos a añadir se tendría que testear de forma distinta. Una pista es que observes el input para la cantidad de prendas en vez de 'button-plus' como yo lo hice.
      • Deberás omitir el paso de seleccionar el tamaño de la prenda, ya que la web que estarás probando no tiene esa opción.
      • Al verificar que el modal y el texto aparecen, en vez del texto "Success" simplemente usa el texto "Added!"

      En resumen, podrás realizar 7 de los 9 test del reto, 2 de ellos con los ajustes mencionados arriba (❗):

      tests-reto.png

      Espero que superes este reto utilizando el ejemplo de la siguiente clase y todo lo que hemos aprendido hasta ahora. Déjame en los comentarios de la siguiente clase cómo quedó tu código y si lograste hacer testing al elemento para incrementar el número de prendas 😉.

        Irving Juárez

        Irving Juárez

        student•
        hace 3 años

        Hice un tutorial de como hacer este reto, para que comparen soluciones y aprendamos de las contribuciones de cada quien: SOLUCION AL RETO

        Mauro Mascheroni

        Mauro Mascheroni

        student•
        hace 3 años

        Una solución o salida rápida que encontre para manejar la publicidad fue recargar la página con el comando page.reload(), esto nos lleva nuevamente a la pagina del home, por lo que se debe hacer click nuevamente al primer producto, por lo que esta vez nos lleva al producto, sin salir la publicidad.

        Douglas Lovera

        Douglas Lovera

        student•
        hace 3 años

        Muy probablemente falle porque la página muestra publicidad, cuidado con eso 😬

        Jennyfer Tatiana Ramirez Ruiz

        Jennyfer Tatiana Ramirez Ruiz

        student•
        hace 7 meses

        in my case i created to files one is runner and other is pages but i created it vey bad 'cause i should to create one for one page and for diferentes fron-ents but here is my work

        Aitor Reguillaga Otaño

        Aitor Reguillaga Otaño

        student•
        hace 3 años

        Aupa! He estado practicado con este reto y quiero compartiros mi propuesta. Se agradecen sugerencias.

        Saludos!

        const SELECTED_PRODUCT = "Rs. 700"; const NUMBER_OFF_UNITS = "10"; test(`I add ${SELECTED_PRODUCT} "${SELECTED_PRODUCT}" model polo and proced to check out`, async ({ page }) => { await page.goto('https://automationexercise.com/'); await page.mouse.wheel(0, 500); await page.locator("a[href='/products']").click(); // This code evited the google ads page if( page.url() === "https://automationexercise.com/#google_vignette"){ await page.frameLocator('iframe[name="aswift_5"]').getByRole('button', { name: 'Close ad' }).click(); } // Navigate to Polo section and choose 'Rs. 700' polo await page.locator("a[href='/brand_products/Polo']").click(); let selectedProductWrapper = page.locator(`div.product-image-wrapper:has-text(' ${SELECTED_PRODUCT}')`); await selectedProductWrapper.hover(); await selectedProductWrapper.locator(".choose a").click(); // ADD 10 polo to the card await page.locator("#quantity").fill(NUMBER_OFF_UNITS); await page.locator("button.cart").click(); await expect(page.locator(".modal-content")).toBeVisible(); await expect(page.locator(".modal-title.w-100")).toHaveText("Added!"); // Confirm the card await page.locator(".modal-content a").click(); await expect(page.locator("tr#product-8 td.cart_quantity button")).toHaveText(NUMBER_OFF_UNITS); // Check out await page.locator("a.check_out").click(); await expect(page.locator(".modal-content")).toBeVisible(); await page.locator(".modal-content a").click(); }
        Felipe Madrigal

        Felipe Madrigal

        student•
        hace 20 días

        Mis tests:

        test('test', async ({ page }) => {

            await page.goto('https://automationexercise.com/products');

            await page.locator('a[href="/product_details/1"]').click();    

            await page.locator('#quantity').fill('3');

            await page.locator('button.cart').click();

            await expect(page.locator('#cartModal')).toBeVisible();

            await page.locator('.btn.btn-success.close-modal.btn-block').click();

            await expect(page.locator('#cartModal')).not.toBeVisible();

        });

        fabian marentes

        fabian marentes

        student•
        hace un mes

        estuvo genial, yo resolvi asi y solucione lo de los anuncios con un test.before para bloquear los anuncios de terceros. import { test, expect } from '@playwright/test';

        test.beforeEach(async ({ page }) => {

          // Bloquear anuncios de terceros

          await page.route('**/*', (route) => {

            const url = route.request().url();

            const ads = [

              'doubleclick.net',

              'googlesyndication.com',

              'googleadservices.com',

              'googletagmanager.com',

            ];

            if (ads.some(ad => url.includes(ad))) {

              return route.abort();

            }

         

            route.continue();

          });

          // Ir a la página base

          await page.goto('https://automationexercise.com/');

          // Cerrar banner de la app si aparece

          const banner = page.getByTestId('banner-close');

          if (await banner.count() > 0 && await banner.isVisible()) {

            await banner.click();

          }

        });

        test('@regression reto producto', async ({ page }) => {

          // 1. ir a navegador

          await page.goto('https://automationexercise.com/');

          // 2. desliza a un producto por el nombre (tiende a cambiar orden, mejor por algo especifico)

          await page  .locator('.product-image-wrapper', { hasText: 'Little Girls Mr. Panda Shirt' }).getByText('View Product').click();

          await expect(page).toHaveURL(/product_details/);

          // 3. ya en el detalle y verifica que este en el producto que es

          await expect(page.getByText('Little Girls Mr. Panda Shirt')).toBeVisible();

          await page.locator('#quantity').click();

          // 4. añade 3 productos

          await page.locator('#quantity').fill('3');

          await page.getByRole('button', { name: ' Add to cart' }).click();

          // 5. valida mesace de agregado

          await expect(page.getByText(' Added! Your product has')).toBeVisible();

          await page.getByRole('button', { name: 'Continue Shopping' }).click();

          // 6. valida que el modal ya no este o este oculto

           await expect(page.getByText(' Added! Your product has')).toBeHidden();

        });

        Juan Aguilera

        Juan Aguilera

        student•
        hace un mes

        Listo reto completado, estuvo un poco complicado por todos los pop-up de anuncios, pero se aprendió a tratarlos en caso de que aparezcan.

        Camilo Jiménez

        Camilo Jiménez

        student•
        hace 2 meses
        •
        editado
        import { test, expect } from "@playwright/test"; test("challenge 1", async ({ page }) => { //go to website await page.goto("https://automationexercise.com/category_products"); //validate products class .features_items is visible await expect(page.locator(".features_items")).toBeVisible(); //click on first product await page.locator("//li/a[text()='View Product']").first().click(); //go back to previous page await page.goBack(); //add 3 products to cart for (let i = 0; i < 3; i++) { await page .locator("//div[contains(@class, 'productinfo')]/a[text()='Add to cart']") .nth(i) .click(); await page.locator("//button[text()='Continue Shopping']").click(); } //validate modal is not v await expect(page.locator(".modal-content")).not.toBeVisible(); });
        Luis Antonio Del Rio Salguero

        Luis Antonio Del Rio Salguero

        student•
        hace 2 meses
        import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://automationexercise.com/'); }); test('test-3', async ({ page }) => { await page.goto('https://automationexercise.com/'); await page.getByRole('link', { name: ' Products' }).click(); await page.getByRole('link', { name: ' Products' }).press('ArrowRight'); await page.getByRole('link', { name: ' Products' }).press('ArrowDown'); await page.getByRole('link', { name: ' Products' }).press('ArrowRight'); await page.getByRole('link', { name: ' Products' }).press('ArrowDown'); }); test('test-2', async ({ page }) => { await page.goto('https://automationexercise.com/'); await page.getByRole('link', { name: ' Products' }).click(); await page.getByRole('link', { name: ' Products' }).press('ArrowRight'); await page.getByRole('link', { name: ' Products' }).press('ArrowDown'); await page.getByRole('link', { name: ' View Product' }).first().click(); }); test('test-1', async ({ page }) => { await page.goto('https://automationexercise.com/'); await page.getByRole('link', { name: ' Products' }).click(); await page.getByRole('link', { name: ' Products' }).press('ArrowRight'); await page.getByRole('link', { name: ' Products' }).press('ArrowDown'); await page.getByRole('link', { name: ' View Product' }).first().click(); await page.locator('#quantity').fill('3'); await page.getByRole('button', { name: ' Add to cart' }).click(); await page.getByRole('button', { name: 'Continue Shopping' }).click(); }); test('test-0', async ({ page }) => { await page.goto('https://automationexercise.com/'); await page.getByRole('link', { name: ' Products' }).click(); await page.getByRole('link', { name: ' Products' }).press('ArrowRight'); await page.getByRole('link', { name: ' Products' }).press('ArrowDown'); await page.getByRole('link', { name: ' View Product' }).first().click(); await page.locator('#quantity').fill('3'); await page.getByRole('button', { name: ' Add to cart' }).click(); await page.getByRole('button', { name: 'Continue Shopping' }).click(); await expect(page.locator('text=Continue Shopping')).toBeHidden(); });
        Totalcoin Training

        Totalcoin Training

        student•
        hace 4 meses
        import { test, expect, Page } from '@playwright/test'; async function pressKeyNTimes(page: Page, key: string, n: number) { for (let i = 0; i < n; i++) { await page.keyboard.press(key); } } test('reto1-Tienda', async ({ page }) => { await page.goto('https://automationexercise.com'); await page.getByRole('link', { name: 'Products' }).click(); await expect(page).toHaveURL('https://automationexercise.com/products'); await expect(page.getByRole('textbox', { name: 'Search Product' })).toBeVisible(); await page.locator('a[href="/product_details/1"]').click(); await page.locator('#quantity').click(); await pressKeyNTimes(page, 'ArrowUp', 2); await expect(page.locator('#quantity')).toHaveValue('3'); await page.locator('.btn-default.cart').click(); await expect(page.locator('.modal-title.w-100:has-text("Added!")')).toBeVisible(); await page.getByRole('button', { name: 'Continue Shopping' }).click(); await expect(page.locator('.modal-content')).not.toBeVisible(); });
        Angelica Garcia

        Angelica Garcia

        student•
        hace 5 meses
        •
        editado

        Les comparto mi parte del reto 🙂

        import { test, expect } from "@playwright/test"; test("test e-commerce page", async ({ page }) =&gt; { // 1. Abre en el navegador la tienda virtual await page.goto("https://automationexercise.com/"); // 2. Dezliza hasta ver los productos await page.mouse.wheel(0, 500); const featuresHeading = page.getByRole("heading", { name: "FEATURES ITEMS" }); await expect(featuresHeading).toBeVisible(); await featuresHeading.scrollIntoViewIfNeeded(); // 3. Haz click en Ver "más detalles" del primer producto await page.getByRole("link", { name: "View Product" }).first().click(); // 4. Usa el boton (+) para añadir 3 productos al carrito await page.fill("#quantity", "3"); // 5. Elije el tamaño del producto TODO: No esta la opción de elegir tamaño // 6. Haz click en "Añadir al carrito" await page.getByRole("button", { name: "Add to cart" }).click(); // 7. Verfica que el modal y el texto de "Success" apaarece await expect(page.getByText("Added!").first()).toBeVisible(); await expect( page.getByText("Your product has been added to cart.") ).toBeVisible(); // 8. Haz click en el boton de Continue Shopping await page.getByRole("button", { name: "Continue Shopping" }).click(); // 9. Verifica que el modal es no es visible await expect(page.getByText("Added!").first()).not.toBeVisible(); });

        Les comparto el gist por si tienen alguna recomendación para mejorar 🙌🏽

        Diego Martinez

        Diego Martinez

        student•
        hace 5 meses
        •
        editado

        A continuacion el codigo tomando en cuenta las restricciones del nuevo website:

        import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://automationexercise.com/products'); await page.locator('a[href="/product_details/1"]').click(); await page.locator('#quantity').fill('3'); await expect(page.locator('#quantity')).toHaveValue('3'); await page.locator('.btn-default.cart').click(); await page.locator('#cartModal').isVisible(); // Verify that product was added correctly const modalBody = page.locator('.modal-body'); await expect(modalBody.getByText('Your product has been added to cart.')).toBeVisible(); await page.locator('.btn-success').click(); // Checking that modal class has changed after clicking on the button await expect(page.locator('#cartModal')).toContainClass('modal fade'); });
        Andrés Felipe Torres Morales

        Andrés Felipe Torres Morales

        student•
        hace 6 meses

        Dado que se indicó que la página utilizada en clase presenta errores, decidí realizar el reto por mi cuenta; antes de ver la clase. Este fue el código que, hasta ahora, me ha parecido el más adecuado y el que mejor pude adaptar a los requerimientos de la prueba.

        Eduardo Rubén Rejón Castillo

        Eduardo Rubén Rejón Castillo

        student•
        hace 7 meses

        Mi solucion

        import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://automationexercise.com/'); await page.locator('h2:has-text("Brands")').scrollIntoViewIfNeeded(); await page.locator('.product-image-wrapper').nth(0).hover(); await page.locator('.overlay-content > .btn').first().click(); expect(page.locator('.overlay-content > .btn').nth(0)).toBeVisible(); await expect(page.locator('.modal-content')).toBeVisible(); await page.getByRole('button', { name: 'Continue Shopping' }).click(); await page.locator('.product-image-wrapper').nth(1).hover(); await page.locator('.overlay-content > .btn').nth(1).click(); expect(page.locator('.overlay-content > .btn').nth(1)).toBeVisible(); await expect(page.locator('.modal-content')).toBeVisible(); await page.getByRole('button', { name: 'Continue Shopping' }).click(); await expect(page.locator('.modal-content')).toBeHidden(); await page.locator('a[href="/product_details/3"]').click(); await expect(page).toHaveURL('https://automationexercise.com/product_details/3'); await page.locator('button:has-text("Add to cart")').click(); await expect(page.locator('.modal-content')).toBeVisible(); await page.getByRole('button', { name: 'Continue Shopping' }).click(); await expect(page.locator('.modal-content')).not.toBeVisible(); }); 0
        PROSPERiA SALUD 3

        PROSPERiA SALUD 3

        student•
        hace 7 meses
        Pablo Cristóbal Castro

        Pablo Cristóbal Castro

        student•
        hace 8 meses

        Para aquellos que no quieran aceptar el "cookie wall"

        async function rejectCookieWall(page:Page) { await page.getByRole('button', {name: 'Manage options'}).click(); const sliderLocatorCollection = page.locator('label > span.fc-preference-slider'); if(await sliderLocatorCollection.count() === 0) return; const number = await sliderLocatorCollection.count(); for (let i = 0; i < number;i++) { const sliderLocator = sliderLocatorCollection.nth(i); const inputLocator = sliderLocatorCollection.nth(i).locator('input[type=checkbox]'); if (await inputLocator.isChecked() && await sliderLocator.isVisible()) await sliderLocator.click() } await page.getByRole('button', { name: 'Confirm choices' }).click(); }
        Esteban Pallares Rodriguez

        Esteban Pallares Rodriguez

        student•
        hace un año
        comparto mi ejercicio
        Juan Camilo García Sequera

        Juan Camilo García Sequera

        student•
        hace un año

        Les comparto mi solución a este ejercicio.

        Evans Ricardo Mondragon Perez

        Evans Ricardo Mondragon Perez

        student•
        hace un año

        por aca dejo mi solucion practica, gracias