Coder Social home page Coder Social logo

Comments (10)

arjunattam avatar arjunattam commented on April 28, 2024 21

Interesting example, thanks for sharing. On observing the page, I noticed that the bottom parts of the page load after scrolling. To replicate this behavior through Playwright, I've added a method scrollFullPage to your code snippet, executed right before taking a screenshot.

const pw = require('playwright');

(async () => {
  const browser = await pw.chromium.launch({ headless: false }); // or 'chromium', 'firefox'
  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://www.waze.com/');
  await scrollFullPage(page);
  
  await page.screenshot({ 
    path: 'example.png',
    fullPage : true
  });
  
  await browser.close();
})();

async function scrollFullPage(page) {
  await page.evaluate(async () => {
    await new Promise(resolve => {
      let totalHeight = 0;
      const distance = 100;
      const timer = setInterval(() => {
        const scrollHeight = document.body.scrollHeight;
        window.scrollBy(0, distance);
        totalHeight += distance;
        
        if (totalHeight >= scrollHeight){
          clearInterval(timer);
          resolve();
        }
      }, 100);
    });
  });
}

from playwright.

rightqa avatar rightqa commented on April 28, 2024 1

Interesting example, thanks for sharing. On observing the page, I noticed that the bottom parts of the page load after scrolling. To replicate this behavior through Playwright, I've added a method scrollFullPage to your code snippet, executed right before taking a screenshot.

const pw = require('playwright');

(async () => {
  const browser = await pw.chromium.launch({ headless: false }); // or 'chromium', 'firefox'
  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://www.waze.com/');
  await scrollFullPage(page);
  
  await page.screenshot({ 
    path: 'example.png',
    fullPage : true
  });
  
  await browser.close();
})();

async function scrollFullPage(page) {
  await page.evaluate(async () => {
    await new Promise(resolve => {
      let totalHeight = 0;
      const distance = 100;
      const timer = setInterval(() => {
        const scrollHeight = document.body.scrollHeight;
        window.scrollBy(0, distance);
        totalHeight += distance;
        
        if (totalHeight >= scrollHeight){
          clearInterval(timer);
          resolve();
        }
      }, 100);
    });
  });
}

Thanks @arjun27 , it worked for the given example. I appreciate your help. Will try with some other examples and let you know how I go.

This project looks interesting, anyway I can contribute to the project? Say some doco, tutorial etc?

from playwright.

bryanjtc avatar bryanjtc commented on April 28, 2024 1

Can scrollFullPage() be implemented with a flag option? I use gsap animations that load the website content when the user scrolls. In my case fullPage: true is not enough.

from playwright.

zac11 avatar zac11 commented on April 28, 2024

Any chance this can be implemented as a method since there are many scenarios where we're in need of taking full page screenshots.
This was a limitation in Puppeteer and it would be a definite plus point for a lot of users imho.
Issue - GoogleChrome/rendertron#108 (Puppeteer doesn't support full page screenshot)

from playwright.

arjunattam avatar arjunattam commented on April 28, 2024

Thanks @zac11. Full page screenshots are supported with the fullPage: true flag. Can you share any examples where the flag does not work for you? Thanks!

from playwright.

jcousins-ynap avatar jcousins-ynap commented on April 28, 2024

It's definitely due to the website animating in all images when inside the viewport. A fullpage screenshot scrolls too fast for the code to show the images. This isn't a puppeteer/playwright limitiation.

I wonder if turning off CSS transitions before taking the screenshot would help?

* {
  transition: unset !important;
}

from playwright.

utkarshpaliwal9 avatar utkarshpaliwal9 commented on April 28, 2024

Thanks @zac11. Full page screenshots are supported with the fullPage: true flag. Can you share any examples where the flag does not work for you? Thanks!

There's this page https://extrasalt.org/ where even with the fullPage flag enabled, playwright doesn't capture the entire page SS. Only a part of it. Attaching the screenshot captured.
https%3A%2F%2Fextrasalt org%2F1

from playwright.

davidricardo1026 avatar davidricardo1026 commented on April 28, 2024

Interesting example, thanks for sharing. On observing the page, I noticed that the bottom parts of the page load after scrolling. To replicate this behavior through Playwright, I've added a method scrollFullPage to your code snippet, executed right before taking a screenshot.

const pw = require('playwright');

(async () => {
  const browser = await pw.chromium.launch({ headless: false }); // or 'chromium', 'firefox'
  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://www.waze.com/');
  await scrollFullPage(page);
  
  await page.screenshot({ 
    path: 'example.png',
    fullPage : true
  });
  
  await browser.close();
})();

async function scrollFullPage(page) {
  await page.evaluate(async () => {
    await new Promise(resolve => {
      let totalHeight = 0;
      const distance = 100;
      const timer = setInterval(() => {
        const scrollHeight = document.body.scrollHeight;
        window.scrollBy(0, distance);
        totalHeight += distance;
        
        if (totalHeight >= scrollHeight){
          clearInterval(timer);
          resolve();
        }
      }, 100);
    });
  });
}

Thanks @arjun27 , it worked for the given example. I appreciate your help. Will try with some other examples and let you know how I go.

This project looks interesting, anyway I can contribute to the project? Say some doco, tutorial etc?

overflow-y: initial !important;
the default overflow will affect the fullscreen args

from playwright.

250king avatar 250king commented on April 28, 2024

I have some problem about screenshot. I don't know why mine is a little fuzzy? Viewport size is 480×1080.
Cache_1a7696eb549ef62e.jpg

from playwright.

slorber avatar slorber commented on April 28, 2024

Similar issue here, I couldn't understand why the bottom of my page gets cropped while running Argos (visual regression tests)

It turns out a widget on the page (the docs 👍 👎 rating widget) produces a layout shift when loading and it messes up with the fullPage screenshot. The bottom cropped part is exactly 109px which is the height this widget takes in practice.

CleanShot 2023-08-24 at 12 05 25@2x

Screenshotting code, using Playwright 1.30:

  await handle.screenshot({
    path: resolve(screenshotFolder, `${name}.png`),
    type: "png",
    fullPage: true,
    mask: [page.locator('[data-visual-test="blackout"]')],
    animations: "disabled",
    ...options,
  });

Considering the widget is visible on both screenshots, it looks to me that there might be some kind of race condition happening in the playwright screenshotting logic. My intuition is:

  • We call screenshot()
  • Screenshot computes the final height
  • The widget appears on the page
  • Playwright takes the screenshot

Example page I found this issue on: https://deploy-preview-3780--react-native.netlify.app/architecture/overview

from playwright.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.