-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Responsive snapshot capture + slow scrolling for CS #594
base: master
Are you sure you want to change the base?
Changes from 4 commits
4fc82d6
fa09ea5
61b195c
c048f3c
cd9c875
22b0dc3
0fdb2aa
9b7f763
d2b64ff
9b5d075
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,7 @@ const ENV_INFO = `${seleniumPkg.name}/${seleniumPkg.version}`; | |
const utils = require('@percy/sdk-utils'); | ||
const { DriverMetadata } = require('./driverMetadata'); | ||
const log = utils.logger('selenium-webdriver'); | ||
const CS_MAX_SCREENSHOT_LIMIT = 25000; | ||
|
||
const getWidthsForMultiDOM = (userPassedWidths, eligibleWidths) => { | ||
// Deep copy of eligible mobile widths | ||
|
@@ -67,17 +68,29 @@ async function captureResponsiveDOM(driver, options) { | |
// Setup the resizeCount listener if not present | ||
/* istanbul ignore next: no instrumenting injected code */ | ||
await driver.executeScript('PercyDOM.waitForResize()'); | ||
let height = currentHeight; | ||
if (process.env.PERCY_RESPONSIVE_CAPTURE_USE_MIN_HEIGHT) { | ||
height = await driver.executeScript(`return window.outerHeight - window.innerHeight + ${utils.percy?.config?.snapshot?.minHeight}`); | ||
} | ||
for (let width of widths) { | ||
if (lastWindowWidth !== width) { | ||
resizeCount++; | ||
await changeWindowDimensionAndWait(driver, width, currentHeight, resizeCount); | ||
await changeWindowDimensionAndWait(driver, width, height, resizeCount); | ||
lastWindowWidth = width; | ||
} | ||
|
||
if (process.env.RESPONSIVE_CAPTURE_SLEEP_TIME) { | ||
await new Promise(resolve => setTimeout(resolve, parseInt(process.env.RESPONSIVE_CAPTURE_SLEEP_TIME) * 1000)); | ||
} | ||
|
||
if (process.env.PERCY_ENABLE_LAZY_LOADING_SCROLL) { | ||
let scrollSleep = 0.45; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Constant variable? |
||
if (process.env.PERCY_LAZY_LOAD_SCROLL_TIME) { | ||
scrollSleep = parseFloat(process.env.PERCY_LAZY_LOAD_SCROLL_TIME); | ||
} | ||
await module.exports.slowScrollToBottom(driver, scrollSleep); | ||
} | ||
|
||
let domSnapshot = await captureSerializedDOM(driver, options); | ||
domSnapshot.width = width; | ||
domSnapshots.push(domSnapshot); | ||
|
@@ -252,3 +265,28 @@ module.exports.percyScreenshot = async function percyScreenshot(driver, name, op | |
module.exports.isPercyEnabled = async function isPercyEnabled() { | ||
return await utils.isPercyEnabled(); | ||
}; | ||
|
||
module.exports.slowScrollToBottom = async (driver, timeInSeconds = 0.45) => { | ||
let scrollHeight = Math.min(await driver.executeScript('return document.documentElement.scrollHeight'), 25000); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. shouldn't the constant variable be used here? |
||
const clientHeight = await driver.executeScript('return document.documentElement.clientHeight'); | ||
let current = 0; | ||
|
||
let page = 1; | ||
// Break the loop if maximum scroll height 25000px is reached | ||
while (scrollHeight > current && current < CS_MAX_SCREENSHOT_LIMIT) { | ||
current = clientHeight * page; | ||
page += 1; | ||
await driver.executeScript(`window.scrollTo(0, ${current})`); | ||
await new Promise(resolve => setTimeout(resolve, timeInSeconds * 1000)); | ||
|
||
// Recalculate scroll height for dynamically loaded pages | ||
scrollHeight = await driver.executeScript('return document.documentElement.scrollHeight'); | ||
} | ||
// Get back to top | ||
await driver.executeScript('window.scrollTo(0, 0)'); | ||
let sleepAfterScroll = 1; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. default sleep? variable? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is sleep after we get back to top There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. since we are reseting it based on env variable it is variable(let) |
||
if (process.env.PERCY_SLEEP_AFTER_LAZY_LOAD_COMPLETE) { | ||
sleepAfterScroll = parseFloat(process.env.PERCY_SLEEP_AFTER_LAZY_LOAD_COMPLETE); | ||
} | ||
await new Promise(resolve => setTimeout(resolve, sleepAfterScroll * 1000)); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.