puppeteer-autoscroll-down
Advanced tools
Comparing version 0.2.0 to 1.0.0
@@ -5,2 +5,8 @@ # Change Log | ||
## 1.0.0 | ||
- Moved to named export. Use `const { scrollPageToBottom } = require('puppeteer-autoscroll-down')`. | ||
- Renamed and moved options to object. Use `scrollPageToBottom(page, { size: 500, delay: 250, stepsLimit: 10 })`. | ||
## 0.2.0 | ||
@@ -7,0 +13,0 @@ |
@@ -1,8 +0,38 @@ | ||
import { Page } from 'puppeteer' | ||
import { Page } from 'puppeteer-core' | ||
export declare function scrollPageToBottom( | ||
page: Page, | ||
scrollSize?: number, | ||
scrollDelay?: number, | ||
scrollStepsLimit?: number | ||
): Promise<number> | ||
export type Options = { | ||
/** | ||
* Number of pixels to scroll on each step | ||
* @type {number} | ||
*/ | ||
size?: number | ||
/** | ||
* Delay after each completed scroll step | ||
* @type {number} | ||
*/ | ||
delay?: number | ||
/** | ||
* Max number of steps to scroll | ||
* @type {number} | ||
*/ | ||
stepsLimit?: number | ||
} | ||
/** | ||
* Scrolling page to bottom | ||
* | ||
* @example | ||
* ```js | ||
* const browser = await puppeteer.launch() | ||
* const page = await browser.newPage() | ||
* await page.goto("https://en.wikipedia.org/wiki/Main_Page") | ||
* const lastPosition = await scrollPageToBottom(page) | ||
* await browser.close() | ||
* ``` | ||
* @param {Page} page | ||
* @param {Options} options | ||
* @returns {Promise<number>} | ||
*/ | ||
export declare function scrollPageToBottom(page: Page, options: Options): Promise<number> |
41
index.js
@@ -1,29 +0,16 @@ | ||
/** | ||
* Scrolling page to bottom based on Body element | ||
* @param {Object} page Puppeteer page object | ||
* @param {Number} scrollSize Number of pixels to scroll on each step | ||
* @param {Number} scrollDelay Delay after each completed scroll step | ||
* @param {Number} scrollStepsLimit Max number of steps to scroll | ||
* @returns {Number} Last scroll position | ||
*/ | ||
async function scrollPageToBottom( | ||
page, | ||
scrollSize = 250, | ||
scrollDelay = 100, | ||
scrollStepsLimit = null | ||
) { | ||
const lastScrollPosition = await page.evaluate( | ||
async (pixelsToScroll, delayAfterStep, stepsLimit) => { | ||
const getElementScrollHeight = (element) => { | ||
async function scrollPageToBottom(page, { size = 250, delay = 100, stepsLimit = null } = {}) { | ||
let lastScrollPosition = await page.evaluate( | ||
async (pixelsToScroll, delayAfterStep, limit) => { | ||
let getElementScrollHeight = element => { | ||
if (!element) return 0 | ||
const { scrollHeight, offsetHeight, clientHeight } = element | ||
let { scrollHeight, offsetHeight, clientHeight } = element | ||
return Math.max(scrollHeight, offsetHeight, clientHeight) | ||
} | ||
const scrollToBottom = (resolve) => { | ||
let scrollToBottom = resolve => { | ||
let lastPosition = 0 | ||
const intervalId = setInterval(() => { | ||
const { body } = document | ||
const availableScrollHeight = getElementScrollHeight(body) | ||
let intervalId = setInterval(() => { | ||
let { body } = document | ||
let availableScrollHeight = getElementScrollHeight(body) | ||
@@ -35,3 +22,3 @@ window.scrollBy(0, pixelsToScroll) | ||
lastPosition >= availableScrollHeight || | ||
(stepsLimit !== null && lastPosition >= pixelsToScroll * stepsLimit) | ||
(limit !== null && lastPosition >= pixelsToScroll * limit) | ||
) { | ||
@@ -46,5 +33,5 @@ clearInterval(intervalId) | ||
}, | ||
scrollSize, | ||
scrollDelay, | ||
scrollStepsLimit | ||
size, | ||
delay, | ||
stepsLimit | ||
) | ||
@@ -55,2 +42,2 @@ | ||
module.exports = scrollPageToBottom | ||
module.exports = { scrollPageToBottom } |
{ | ||
"name": "puppeteer-autoscroll-down", | ||
"version": "0.2.0", | ||
"version": "1.0.0", | ||
"description": "Handle infinite scroll on websites with puppeteer", | ||
"main": "index.js", | ||
"types": "./index.d.ts", | ||
"engines": { | ||
"node": ">=12" | ||
}, | ||
"license": "MIT", | ||
"author": "mbalabash <maksim.balabash@gmail.com>", | ||
"scripts": { | ||
"prettier": "prettier --write -l '**/*.js'", | ||
"eslint": "eslint . --cache --fix", | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
"unit": "tsm node_modules/uvu/bin.js test/", | ||
"test": "eslint . && check-dts && yarn unit" | ||
}, | ||
"peerDependencies": { | ||
"puppeteer": ">5.x" | ||
"eslintConfig": { | ||
"extends": "@logux/eslint-config" | ||
}, | ||
"eslintIgnore": [ | ||
"example/index.js" | ||
], | ||
"prettier": { | ||
"arrowParens": "avoid", | ||
"quoteProps": "as-needed", | ||
"semi": false, | ||
"singleQuote": true, | ||
"trailingComma": "none" | ||
}, | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"@logux/eslint-config": "^46.1.0", | ||
"@types/puppeteer": "^5.4.4", | ||
"eslint": "^8.1.0", | ||
"eslint-config-airbnb": "^18.2.1", | ||
"eslint-config-prettier": "^8.3.0", | ||
"eslint-plugin-import": "^2.25.2", | ||
"eslint-plugin-jest": "^25.2.3", | ||
"husky": "^7.0.4", | ||
"lint-staged": "^11.2.6", | ||
"prettier": "^2.4.1" | ||
"check-dts": "^0.6.5", | ||
"eslint": "^8.4.1", | ||
"eslint-config-standard": "^16.0.3", | ||
"eslint-plugin-import": "^2.25.3", | ||
"eslint-plugin-node": "^11.1.0", | ||
"eslint-plugin-prefer-let": "^3.0.1", | ||
"eslint-plugin-promise": "^5.2.0", | ||
"find-chrome-bin": "^0.1.0", | ||
"puppeteer-core": "^13.0.0", | ||
"tsm": "^2.2.1", | ||
"typescript": "^4.5.3", | ||
"uvu": "^0.5.2" | ||
}, | ||
"husky": { | ||
"hooks": { | ||
"pre-commit": "lint-staged" | ||
} | ||
}, | ||
"lint-staged": { | ||
"*.(js)": [ | ||
"prettier --write", | ||
"eslint --cache", | ||
"git add" | ||
] | ||
}, | ||
"keywords": [ | ||
"headless-chrome", | ||
"puppeteer", | ||
@@ -43,9 +53,7 @@ "parsing", | ||
], | ||
"homepage": "https://github.com/mbalabash/puppeteer-autoscroll-down/blob/master/README.md", | ||
"homepage": "https://github.com/mbalabash/puppeteer-autoscroll-down#readme", | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/mbalabash/puppeteer-autoscroll-down" | ||
}, | ||
"author": "mbalabash", | ||
"license": "MIT" | ||
} | ||
} |
@@ -1,13 +0,25 @@ | ||
## Handle infinite scroll on websites with puppeteer | ||
# Handle infinite scroll on websites with puppeteer | ||
Small puppeteer tool which makes your parsing experience a little bit better | ||
### Usage | ||
## Usage | ||
**`size` - Number of pixels to scroll on each step** `[default: 250]`. | ||
**`delay` - Delay in ms after each completed scroll step** `[default: 100]`. | ||
**`stepsLimit` - Max number of steps to scroll** `[default: null]`. | ||
```js | ||
const puppeteer = require('puppeteer') | ||
const { scrollPageToBottom } = require('puppeteer-autoscroll-down') | ||
const browser = await puppeteer.launch() | ||
const page = await browser.newPage() | ||
await page.goto(SOME_URL) | ||
await page.goto('http://example.com') | ||
const lastPosition = await scrollPageToBottom(page) | ||
const lastPosition = await scrollPageToBottom(page, { | ||
size: 500, | ||
delay: 250 | ||
}) | ||
@@ -17,17 +29,28 @@ await browser.close() | ||
**You can use returned value with request/response hooks to handle async content uploading.** | ||
### Async content loading | ||
### Scrolling options | ||
**You can use returned value with request/response hooks to handle async content loading.** | ||
**`scrollSize` - Number of pixels to scroll on each step** `[default: 250]`. | ||
```js | ||
const puppeteer = require('puppeteer') | ||
const { scrollPageToBottom } = require('puppeteer-autoscroll-down') | ||
**`scrollDelay` - Delay in ms after each completed scroll step** `[default: 100]`. | ||
const browser = await puppeteer.launch() | ||
const page = await browser.newPage() | ||
await page.goto('http://example.com') | ||
**`scrollStepsLimit` - Max number of steps to scroll** `[default: null]`. | ||
let isLoadingAvailable = true // Your condition-to-stop | ||
### How? | ||
while (isLoadingAvailable) { | ||
await scrollPageToBottom(page, { size: 500 }) | ||
await page.waitForResponse( | ||
response => response.url() === 'http://example.com' && response.status() === 200 | ||
) | ||
isLoadingAvailable = false // Update your condition-to-stop value | ||
} | ||
**We take available scroll height from `body` element and then using [`window.scrollBy`](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) method to scroll pages.** | ||
await browser.close() | ||
``` | ||
### Install | ||
## Install | ||
@@ -44,4 +67,4 @@ ```js | ||
### Contributing | ||
## License | ||
Feel free to ask or open an issue. | ||
MIT |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
58860
0
12
128
0
69
14
1