npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

puppeteer-request-spy-abort

v1.3.1

Published

watch, fake or block requests from puppeteer matching patterns

Downloads

1

Readme

puppeteer-request-spy

Build Status Coverage Status FOSSA Status

With puppeteer-request-spy you can easily watch, fake or block requests from puppeteer matching patterns.

  • allows you to write tests verifying specific resources are loaded as expected
  • allows you to exclude unneeded requests from tests, speeding them up significantly
  • allows you to alter a request's response with custom content and http status
  • avoids conflicts resulting from already aborted / continued or responded requests

Install

npm install puppeteer-request-spy --save-dev

Usage

Spying on requests with a KeywordMatcher

First create a new RequestInterceptor with a matcher function and an optional logger.

function KeywordMatcher(testee, keyword) {
    return testee.indexOf(keyword) > -1; 
}

let requestInterceptor = new RequestInterceptor(KeywordMatcher, console);

Next create a new RequestSpy with a pattern to be matched against all requests.

let imageSpy = new RequestSpy('/pictures');

The RequestSpy needs to be registered with the RequestInterceptor.

requestInterceptor.addSpy(imageSpy);

To use the puppeteer's request event the RequestInterception flag on the page object has to be set to true.

await page.setRequestInterception(true);

The RequestInterceptor must be registered with puppeteer.

page.on('request', requestInterceptor.intercept.bind(requestInterceptor));

After puppeteer's page object finished navigating to any page, you can query the RequestSpy.

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

assert.ok(!imageSpy.getMatchedRequests()[0].failure());
assert.ok(imageSpy.hasMatch() && imageSpy.getMatchCount() > 0);

When all responses have been loaded you can also query the response of any matched Request. You can ensure all responses have been loaded by using the networkidle0 option. For further information check the official puppeteer API.

for (let match of imagesSpy.getMatchedRequests()) {
    assert.ok(match.response().ok());
}

Note

Since unhandled Promise rejections causes the node process to keep running after test failure, the RequestInterceptor will catch and log puppeteer's exception, if the requestInterception flag is not set.

Altering Responses

Faking Responses

The response of intercepted requests can be replaced by adding a ResponseFaker to the RequestInterceptor. The fake response has to match the Response object as specified in the official puppeteer API.

let responseFaker = new ResponseFaker('/ajax/some-request', {
    status: 200,
    contentType: 'application/json',
    body: JSON.stringify({successful: false, payload: []})
});

requestInterceptor.addFaker(responseFaker);

For further details on how to replace different formats of data like images, text or html, please refer to the examples provided in the github repository.

Blocking requests

Optionally you can add patterns to block requests. Blocking requests speeds up page load since no data is loaded. Blocking requests takes precedence over faking responses, so any request blocked will not be replaced even when matching a ResponseFaker. Blocked or faked requests will still be counted by a RequestSpy with a matching pattern.

requestInterceptor.block(['scripts', 'track', '.png']);      

Minimatch

puppeteer-request-spy works great with minimatch, it can be passed as the matcher function.

const minimatch = require('minimatch');

let cssSpy = new RequestSpy('**/*.css');
let responseFaker = new ResponseFaker('**/*.jpg', someFakeResponse);
                                                        
let requestInterceptor = new RequestInterceptor(minimatch);  
requestInterceptor.addFaker(responseFaker);
requestInterceptor.addSpy(cssSpy);   
requestInterceptor.block('**/*.js');

await page.setRequestInterception(true);
page.on('request', requestInterceptor.intercept.bind(requestInterceptor));  
await page.goto('https://www.example.com');
                                                 
assert.ok(cssSpy.hasMatch() && cssSpy.getMatchCount() > 0);
for (let matchedRequest of cssSpy.getMatchedRequests()) {
    assert.ok(matchedRequest.response().status() === 200);
}

API

class: RequestInterceptor

The RequestInterceptor will call all spies, fakers and blocker to dertermine if an intercepted request matches. against the matcher function and notify all spies with a matching pattern and block requests matching any pattern in urlsToBlock.

RequestInterceptor constructor(matcher, logger?)

  • matcher: <(url: string, pattern: string) => boolean>>
  • logger?: <{log: (text: string) => void}>

The matcher will be called for every url, testing the url against patterns of any RequestSpy provided and also any url added to urlsToBlock.

The logger if provided will output any requested url with a 'loaded' or 'aborted' prefix and any exception caused by puppeteer's abort and continue functions.

RequestInterceptor.intercept(interceptedRequest)

  • interceptedRequest: interceptedRequest provided by puppeteer's 'request' event

Function to be registered with puppeteer's request event.

RequestInterceptor.addSpy(requestSpy)

  • requestSpy: <IRequestSpy> spy to register

Register a spy with the RequestInterceptor.

RequestInterceptor.clearSpies()

Clears all registered spies.

RequestInterceptor.addFaker(requestFaker)

  • responseFaker: <IResponseFaker> faker to register

RequestInterceptor.clearFakers()

Clears all registered fakers.

RequestInterceptor.block(urlsToBlock)

  • urlsToBlock: <Array<string> | <string>> urls to be blocked if matched

block will always add urls to the list urlsToBlock. Passed arrays will be merged with urlsToBlock.

RequestInterceptor.setUrlsToBlock(urlsToBlock)

  • urlsToBlock: <Array<string>> setter for urlsToBlock

RequestInterceptor.clearUrlsToBlock()

Clears all registered patterns in urlsToBlock.

RequestInterceptor.setRequestBlocker(requestBlocker)

  • requestBlocker <IRequestBlocker>

Allows you to replace the default RequestBlocker by your own implementation.

class: RequestSpy implements IRequestSpy

RequestSpy is used to count and verify intercepted requests matching a specific pattern.

RequestSpy constructor(pattern)

  • pattern: <string|Array<string>>

pattern passed to the matcher function of the RequestInterceptor.

RequestSpy.hasMatch()

  • returns: <boolean> returns whether any url matched the pattern

RequestSpy.getMatchedUrls()

  • returns: <Array<string>> returns a list of urls that matched the pattern

RequestSpy.getMatchedRequests()

  • returns: <Array<Request>> returns a list of requests that matched the pattern

RequestSpy.getMatchCount()

  • returns: <number> number of urls that matched the pattern

RequestSpy.isMatchingRequest(request, matcher)

  • request <Request> request object provided by puppeteer
  • matcher <(url: string, pattern: string) => boolean>> matching function passed to RequestInterceptor's constructor
  • returns: <boolean> returns true if any pattern provided to the RequestSpy matches the request url

The RequestInterceptor calls this method to determine if an interceptedRequest matches the RequestSpy.

RequestSpy.addMatch(matchedRequest)

  • matchedRequest: <Request> request that was matched

The RequestInterceptor calls this method when an interceptedRequest matches the pattern.

class: ResponseFaker implements IResponseFaker

ResponseFaker is used to provide a fake response when matched to a specific pattern.

ResponseFaker constructor(pattern, responseFake)

  • pattern: <string|Array>
  • responseFake: <Response> for details refer to puppeteer API

ResponseFaker.getPatterns()

  • returns: <Array<string>> return the pattern list of the faker

ResponseFaker.getResponseFake()

  • returns: <Response> return the fake response

The RequestInterceptor calls this method when an interceptedUrl matches the pattern.

ResponseFaker.isMatchingRequest(request, matcher)

  • request <Request> request object provided by puppeteer
  • matcher <(url: string, pattern: string) => boolean>> matching function passed to RequestInterceptor's constructor
  • returns: <boolean> returns true if any pattern provided to the ResponseFaker matches the request url

The RequestInterceptor calls this method to determine if an interceptedRequest matches.

class: RequestBlocker implements IResponseBlocker

RequestBlocker is used to by the RequestInterceptor to match requests to block.

RequestBlocker.shouldBlockRequest(request, matcher)

  • request <Request> request object provided by puppeteer
  • matcher <(url: string, pattern: string) => boolean>> matching function passed to RequestInterceptor's constructor

The RequestInterceptor calls this method to determine if an interceptedRequest matches.

RequestBlocker.addUrlsToBlock(urls)

  • urls <Array | string>

Adds new urls to the block list.

RequestBlocker.clearUrlsToBlock()

Removes all entries of the block list.

Examples

There are some usage examples included in the github repository. Check them out to get started with writing a simple test with puppeteer and puppeteer-request-spy.

Related

  • minimatch - For easily matching path-like strings to patterns.
  • puppeteer - Control chrome in headless mode with puppeteer for automated testing.

License

MIT

FOSSA Status